分组背包问题
二维:
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 }