背包问题I |
试题描述 |
有一个背包容积为 V 和 n 个物品,并给出每个物品有一个体积。要求从 n 个物品中,任取若干个装入背包内,使背包的剩余空间为最小。 |
输入 |
第一行两个正整数 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。求在体积不超容积的前提下,背包中可装物品价值的最大值。 |
输入 |
第一行:两个整数 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。求在体积不超容积的前提下,背包中物品价值最大值。 |
输入 |
第一行:两个整数 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的物品,求所有挑选方案中价值总和的最大值。 |
输入 |
三行,第一行包含两个正整数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 }
时间: 2024-11-03 21:02:15