码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-21 00:05:51      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

                      

            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 }

 

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

标签:

原文地址:http://www.cnblogs.com/hutaishi/p/4746395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!