1. 程式人生 > 實用技巧 >分組揹包問題

分組揹包問題

分組揹包問題

二維:

 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 }