1. 程式人生 > 實用技巧 >0-1揹包

0-1揹包

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))
#define
sc1(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]); } }