1. 程式人生 > >51Nod 1085 背包問題 (01背包)

51Nod 1085 背包問題 (01背包)

white pan ces std ont ++ con 輸入 cal

在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背包)