ECNUOJ 2143 端午节快乐

时间:2022-10-20 18:44:29

端午节快乐

Time Limit:1000MS Memory Limit:65536KB
Total Submit:1720 Accepted:868

Description 

有一段有趣的传说。公元前340年,爱国诗人、楚国大夫屈原,面临亡国之痛,于五月五日,悲愤地怀抱大石投汩罗江,为了不使鱼虾损伤他的躯体,人们纷纷用竹筒装米投入江中。以后,为了表示对屈原的崇敬和怀念,每到这一天,人们便用竹筒装米,投江祭奠,这就是我国最早的粽子——“筒粽”的由来。
ECNUOJ 2143 端午节快乐
今天是端午节,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题,记忆化搜索啦

ECNUOJ 2143 端午节快乐ECNUOJ 2143 端午节快乐
 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 }
View Code