端午节快乐
Time Limit:1000MS Memory Limit:65536KB
Total Submit:1720 Accepted:868
Description
有一段有趣的传说。公元前340年,爱国诗人、楚国大夫屈原,面临亡国之痛,于五月五日,悲愤地怀抱大石投汩罗江,为了不使鱼虾损伤他的躯体,人们纷纷用竹筒装米投入江中。以后,为了表示对屈原的崇敬和怀念,每到这一天,人们便用竹筒装米,投江祭奠,这就是我国最早的粽子——“筒粽”的由来。
今天是端午节,ECNU决定请大家吃粽子。恰好,今天超市为了迎合"端午节",推出了"端午大酬宾",即促销活动。严格的买三送一,买五送二。
ECNU想用现有的钱,买最多的粽子,但是他自己又不会算,所以希望你能帮帮他。
Input
输入第一行为一个数N(1<=N<=100),表示测试数据的组数。
每组测试数据有两个整数,A,B (0<=A<=1000,0<B<10)表示ECNU有A元钱,每个粽子价格为B元钱,超市推出了买5个送2个,和买3个送1个的活动。
Output
输出ECNU最多能买到的粽子数量。
Sample Input
2
10 3
22 3
Sample Output
4
9
Hint:
有两组测试数据:
对于第一组测试数据:有10元钱,粽子3元一个,可以买3个,但是买3送1,所以最后有4个。
对于第二组测试数据:有22元钱,粽子3元一个,可以买7个,但是买5送2,所以最后有9个。
Source
解题:一道dp题,记忆化搜索啦
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1010; 4 int dp[maxn],A,B; 5 int dfs(int money) { 6 if(money < B) return 0; 7 if(dp[money]) return dp[money]; 8 int ret = 0; 9 if(money >= B*5) ret = max(ret,dfs(money - B*5) + 7); 10 if(money >= B*3) ret = max(ret,dfs(money - B*3) + 4); 11 if(money >= B) ret = max(ret,dfs(money - B) + 1); 12 return dp[money] = ret; 13 } 14 int main() { 15 int n; 16 scanf("%d",&n); 17 while(n--) { 18 scanf("%d%d",&A,&B); 19 memset(dp,0,sizeof dp); 20 printf("%d\n",dfs(A)); 21 } 22 return 0; 23 }