51Nod 1085 背包问题 (01背包)
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
输入
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
输出
输出可以容纳的最大价值。
输入样例
3 6
2 5
3 8
4 9
输出样例
14
第一种:dp二维表示
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int t,n,W; 5 int v[1005]; 6 int w[1005]; 7 int dp[105][10005]; 8 9 int main() 10 { 11 while(cin>>n>>W){ 12 for(int i=0;i<n;i++) cin>>w[i]>>v[i]; 13 for(int i=0;i<n;i++){ 14 for(int j=0;j<=W;j++){ 15 if(j<w[i]) dp[i+1][j]=dp[i][j]; 16 else dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]); 17 } 18 } 19 cout<<dp[n][W]<<endl; 20 } 21 return 0; 22 }
第二种:dp一维表示
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int t,n,W; 5 int v[1005]; 6 int w[1005]; 7 int dp[10005]; 8 9 int main() 10 { 11 while(cin>>n>>W){ 12 for(int i=0;i<n;i++) cin>>w[i]>>v[i]; 13 for(int i=0;i<n;i++){ 14 for(int j=W;j>=w[i];j--){ 15 dp[j]=max(dp[j],dp[j-w[i]]+v[i]); 16 } 17 } 18 cout<<dp[W]<<endl; 19 } 20 return 0; 21 }