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 } 

 

posted @ 2019-03-20 20:10  wydxry  阅读(350)  评论(0编辑  收藏  举报
Live2D