CRB and His Birthday 01背包 + 多重背包

                      

            CRB and His Birthday

题目抽象:背包问题,这里x个物品的价值是a * x + b (x > 0)  or 0 (x = 0).

分析:将物品按购买数量分类  1. 1件,  2 多件(>1).  对于一件的情况是01背包。  对于多件的情况是多重背包。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int dp[2005];
 6 
 7 int main() {
 8     int T, n, m, a, b, c;
 9     scanf("%d", &T);
10     while (T--) {
11         scanf("%d%d", &m, &n);
12         memset(dp, 0, sizeof(dp));
13         for (int i = 0; i < n; i++) {
14             scanf("%d%d%d", &a, &b, &c);
15             for (int j = m; j >= a; j--)     // 01背包   将物品按数量为类  这里处理的是购买一件物品
16                 dp[j] = max(dp[j], dp[j - a] + b + c);
17             for (int j = a; j <= m; j++)            //  这里处理的是购买多件( > 1)物品。
18                 dp[j] = max(dp[j], dp[j - a] + b);
19             // 注意当这里购买物品为一件是,+b, 这种情况显然比购买一件 + a + b,要小。+b不符合题意,这里也取不到+b的情况。
20         }
21         printf("%d\n",dp[m]);
22     }
23     return 0;
24 }

 

posted on 2015-08-20 22:11  hutaishi  阅读(119)  评论(0)    收藏  举报

导航