AcWing 5.多重背包问题
题目链接:https://www.acwing.com/problem/content/5/
博客链接:https://www.cnblogs.com/marswithme/p/16756244.html
放AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 25000, M = 2010;//1000*log2000 向上取整24000 4 int n, m; 5 int v[N], w[N]; 6 int dp[M]; 7 8 int main() 9 { 10 cin >> n >> m; 11 int cnt = 0;//记录共有几组新物品 12 for(int i = 1; i <= n; i ++) 13 { 14 int a, b, s;//体积、价值、数量 15 cin >> a >> b >>s; 16 int k = 1; 17 while(k <= s) 18 { 19 cnt ++; 20 v[cnt] = a * k; 21 w[cnt] = b * k; 22 s -= k; 23 k *= 2; 24 } 25 if(k > 0) 26 { 27 cnt ++; 28 v[cnt] = a * s; 29 w[cnt] = b * s; 30 } 31 } 32 33 n = cnt; 34 35 for(int i = 1; i <= n; i ++) 36 for(int j = m; j >= v[i]; j --) 37 dp[j] = max(dp[j], dp[j-v[i]] + w[i]); 38 39 cout << dp[m] << endl; 40 return 0; 41 }