揹包問題I |
試題描述
|
有一個揹包容積爲 V 和 n 個物品,並給出每一個物品有一個體積。要求從 n 個物品中,任取若干個裝入揹包內,使揹包的剩餘空間爲最小。ios |
輸入
|
第一行兩個正整數 V 和 n,分別表示揹包的容積和待裝物品的個數;第二行包括 n 個正整數,表示 n 個物品的體積,兩兩之間有一個空格分隔。
|
輸出
|
一個數,表示揹包中剩餘空間的最小值
|
輸入示例
|
24 6 8 3 12 7 9 7 |
輸出示例
|
0
|
其餘說明
|
數據範圍:0<V≤20000,0<n≤30
|
揹包問題II |
試題描述
|
仍然是揹包問題……典型0-1揹包!題曰:今有n個物品,第i個體積爲V[i],價值爲W[i],揹包的容積爲C。求在體積不超容積的前提下,揹包中可裝物品價值的最大值。ide |
輸入
|
第一行:兩個整數 n 和 C ;
第二行~第n+1行:每行兩個整數Vi與Wi,有一個空格分隔。 |
輸出
|
一個數,表示揹包中能獲得物品價值的最大值。
|
輸入示例
|
2 10 1 1 2 2 |
輸出示例
|
3
|
1 #include<iostream> 2 using namespace std; 3 int a[10001]={},b[10001]={},temp1,temp2;//b[i]爲上一行,a[i]爲這行 4 int main() 5 { 6 int n,c; 7 int i,j; 8 cin>>n>>c; 9 for(i=1;i<=n;i++) 10 { 11 cin>>temp1>>temp2;//輸入 12 for(j=1;j<=c;j++)//DP 13 { 14 if(j<temp1) a[j]=b[j]; 15 else{a[j]=max(b[j-temp1]+temp2,b[j]);} 16 } 17 for(j=1;j<=c;j++)b[j]=a[j]; 18 } 19 cout<<b[c]; 20 }
揹包問題III |
試題描述
|
揹包問題,古之經典。題曰:今有n類物品無數,第i種體積爲V[i],價值爲W[i],揹包的體積爲C。求在體積不超容積的前提下,揹包中物品價值最大值。spa |
輸入
|
第一行:兩個整數 n 和 C ;
第二行~第n+1行:每行兩個整數Vi與Wi,有一個空格分隔。 |
輸出
|
一個數,表示揹包中能獲得物品價值的最大值。
|
輸入示例
|
4 1000 1 1000 2 1231 3 1232 4 1010 |
輸出示例
|
1000000
|
其餘說明
|
數據範圍:1<=n<=100 1<=Vi,Wi<=100;1<=C<=10000;
|
1 #include<iostream> 2 using namespace std; 3 int a[2][10001]={},temp1,temp2; 4 int main() 5 { 6 int n,c; 7 int i,j; 8 cin>>n>>c; 9 for(i=1;i<=n;i++) 10 { 11 cin>>temp1>>temp2; 12 for(j=1;j<=c;j++) 13 { 14 if(j<temp1) a[1][j]=a[0][j]; 15 else{a[1][j]=max(a[1][j-temp1]+temp2,a[0][j]);} 16 } 17 for(j=1;j<=c;j++) a[0][j]=a[1][j]; 18 } 19 cout<<a[1][c]; 20 }
揹包問題Ⅳ |
試題描述
|
有n個重量和價值分別爲Wi和Vi的物品。從這些物品中挑選出總重量不超過W的物品,求全部挑選方案中價值總和的最大值。code |
輸入
|
三行,第一行包含兩個正整數n和W,第二行包含n個正整數依次表示i個物品各自的重量,第三行包含n個正整數依次表示i個物品各自的價值。同一行的數兩兩之間有一個空格分隔。
|
輸出
|
一個數,表示價值總和的最大值。
|
輸入示例
|
4 5 2 1 3 2 3 2 4 2 |
輸出示例
|
7
|
其餘說明
|
數據範圍:1<=n,Vi<=100,1<=W<=10^9,1<=Wi<=10^7.
|
1 #include<iostream> 2 using namespace std; 3 int a[2][10005]={},t1[101],t2[101]; 4 int main() 5 { 6 int n,w; 7 cin>>n>>w; 8 for(int i=1;i<=n;i++) scanf("%d",&t1[i]); 9 for(int i=1;i<=n;i++) scanf("%d",&t2[i]); 10 for(int i=1;i<=n;i++) 11 { 12 for(int j=10001;j>=1;j--) 13 { 14 a[1][j]=a[0][j]; 15 if(j<t2[i]) break; 16 if(j-t2[i]==0) 17 { 18 if(a[1][j]==0) a[1][j]=t1[i]; 19 else a[1][j]=min(a[1][j],t1[i]); 20 } 21 else if(a[0][j-t2[i]]!=0) 22 { 23 if(!a[1][j]) a[1][j]=a[0][j-t2[i]]+t1[i]; 24 else a[1][j]=min(a[1][j],a[0][j-t2[i]]+t1[i]); 25 } 26 } 27 for(int j=1;j<=10001;j++) a[0][j]=a[1][j]; 28 } 29 int ans=0; 30 for(int i=1;i<=10001;i++) if(a[1][i]<=w&&a[1][i]!=0) ans=i; 31 cout<<ans; 32 }