51Nod 1085 背包问题 (01背包)

Posted shixinzei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 } 

 

以上是关于51Nod 1085 背包问题 (01背包)的主要内容,如果未能解决你的问题,请参考以下文章

51nod1085(01背包)

51Nod 1085 01背包

模板51Nod--1085 01背包

51nod 1085 背包问题

(DP)51NOD 1085 背包问题

1085 背包问题(0-1背包模板题)