51Nod 1085 背包問題 (01背包)
阿新 • • 發佈:2019-03-20
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 return0; 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背包)