标签:
题目抽象:背包问题,这里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