0-1揹包
阿新 • • 發佈:2020-07-23
0/1揹包 package.pas
【問題描述】
有1個容量為m的揹包,現有n種物品,重量分別為w1,w2…wn,價值分別為v1,v….vn,若每種物品只有1件,求能放入的最大總價值。
【輸入格式】
第一行:兩個整數m(m<=200)和n(n<=30)
第2~n+1,每行兩個整數wi和vi
【輸出格式】
一個數據,最大總價值
【輸入樣例】
10 4
2 1
3 3
4 5
7 9
【輸出樣例】
12
程式碼
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define mem(a) memset(a,0,sizeof(a)) #definesc1(a) scanf("%lld",&a) #define sc2(a,b) scanf("%lld%lld",&a,&b) #define sc3(a,b,c) scanf("%lld%lld%lld",&a,&b,&c) const ll MAXN=1e9+7; const ll N=1e5+5; ll dp[N]; int main() { ll m,n,i,j; sc2(m,n); ll w[n],v[n]; for(i=0;i<n;i++) { sc2(w[i],v[i]); } mem(dp);for(i=0;i<n;i++) { for(j=m;j>=w[i];j--) { dp[j]=max(dp[j],dp[j-w[i]]+v[i]); } } cout<<dp[m]<<endl; }
思路
1、定義dp陣列,dp的下標指的是最大重量dp本身是作為價值的總和,當dp的下標值為容量即為最大值
2、迴圈體(很重要)
for(i=0;i<數量;i++) { for(j=容量;j>=體積[i];j++) { dp[j]=max(dp[j],dp[j-w[i]]+v[i]); } }