分组背包问题

分组背包问题

 

 

 

 二维:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 110;
 5 
 6 int dp[maxn][maxn];//dp[i][j]:只从前i组物品中选, 当前体积小于等于j的最大值
 7 int v[maxn][maxn], w[maxn][maxn], s[maxn]; //v为体积, w为价值, s代表第i组物品的个数
 8 int n,m,k;
 9 
10 int main()
11 {
12     scanf("%d%d",&n,&m);
13     for(int i=1;i<=n;i++){
14         scanf("%d",&s[i]);
15         for(int j=0;j<s[i];j++){
16             scanf("%d%d",&v[i][j], &w[i][j]);
17         }
18     }
19     for(int i=1;i<=n;i++){
20         for(int j=0;j<=m;j++){
21             dp[i][j] = dp[i-1][j];//第i组不选
22             for(int k=0;k<s[i];k++){//第i组选哪个
23                 if( j>=v[i][k] ){
24                     dp[i][j] = max(dp[i][j], dp[i-1][j-v[i][k]]+w[i][k]);
25                 }
26             }
27         }
28     }
29     printf("%d\n",dp[n][m]);
30     return 0;
31 }

一维:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 110;
 5 
 6 int dp[maxn];//仿照01背包滚动数组
 7 int v[maxn][maxn], w[maxn][maxn], s[maxn]; //v为体积, w为价值, s代表第i组物品的个数
 8 int n,m,k;
 9 
10 int main()
11 {
12     scanf("%d%d",&n,&m);
13     for(int i=1;i<=n;i++){
14         scanf("%d",&s[i]);
15         for(int j=0;j<s[i];j++){
16             scanf("%d%d",&v[i][j], &w[i][j]);
17         }
18     }
19     for(int i=1;i<=n;i++){
20         for(int j=m;j>=0;j--){
21             for(int k=0;k<s[i];k++){//第i组选哪个
22                 if( j>=v[i][k] ){
23                     dp[j] = max(dp[j], dp[j-v[i][k]]+w[i][k]);
24                 }
25             }
26         }
27     }
28     printf("%d\n",dp[m]);
29     return 0;
30 }

 

posted @ 2020-12-04 21:07  swsyya  阅读(73)  评论(0编辑  收藏  举报

回到顶部