题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21852 Accepted Submission(s): 9242
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define N 20005 int dp[N], p[N], w[N], m[N]; int main () { int t, price, n; scanf ("%d", &t); while (t--) { memset (dp, 0, sizeof (dp)); scanf ("%d %d", &price, &n); int k = 1, x, y, z; for (int i=1; i<=n; i++) { scanf ("%d %d %d", &x, &y, &z); int cnt = 0; for (int j=1; j<=z; j*=2) { p[k] = x*j, w[k++] = y*j; cnt+=j; if(cnt+j*2 > z) { p[k] = x*(z-cnt), w[k++] = y*(z-cnt); break; } } } for (int i=1; i<k; i++) { for (int j=price; j>=p[i]; j--) dp[j] = max (dp[j], dp[j-p[i]] + w[i]); } printf ("%d\n", dp[price]); } return 0; }
HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
原文:http://www.cnblogs.com/mengzhong/p/5244643.html