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 }

 

posted @ 2022-10-10 18:57  爱吃虾滑  阅读(17)  评论(0编辑  收藏  举报