背包1
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
有 n 个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量不超过 W 的物品,求所有方案中价值总和的最大值。
Input:
输入包含多组测试用例,每一例的开头为两位整数 n、W(1<=n<=10000,1<=W<=1000),接下来有 n 行,每一行有两位整数 Wi、Vi(1<=Wi<=10000,1<=Vi<=100)。
Output:
输出为一行,即所有方案中价值总和的最大值。
Sample Input:
3 4 1 2 2 5 3 7
Sample Output:
9
解题思路:简单的01背包,一维数组实现。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int v[10005],w[10005],dp[10005];//dp数组始终记录当前体积的最大价值 4 int main() 5 { 6 int n,W; 7 while(cin>>n>>W){ 8 for(int i=0;i<n;i++) 9 cin>>w[i]>>v[i]; 10 memset(dp,0,sizeof(dp)); 11 for(int i=0;i<n;++i){ //个数 12 for(int j=W;j>=w[i];--j) //01背包 13 dp[j]=max(dp[j],dp[j-w[i]]+v[i]); //比较放入i物体后的价值与不放之前的价值,记录大的值 14 } 15 cout<<dp[W]<<endl;//输出总体积的最大值 16 } 17 return 0; 18 }