1. 程式人生 > >揹包問題入門 01揹包和完全揹包

揹包問題入門 01揹包和完全揹包

01揹包問題
有N種物品,每種物品的數量為C1,C2……Cn。從中任選若干件放在容量為W的揹包裡,每種物品的體積為W1,W2……Wn(Wi為整數),與之相對應的價值為P1,P2……Pn(Pi為整數)。求揹包能夠容納的最大價值。

Input
第1行,2個整數,N和W中間用空格隔開。N為物品的種類,W為揹包的容量。(1 <= N <= 100,1 <= W <= 50000)
第2 - N + 1行,每行3個整數,Wi,Pi和Ci分別是物品體積、價值和數量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)

Input示例
11 12
2 5
4 5
5 6
3 5
4 7
5 7
2 3
2 9
3 4
4 5
5 6

Output示例
26

答案怎麼來的?我們畫表格——最大重量與最大價值的關係圖

這裡寫圖片描述

01揹包問題核心遞推關係

for(int j=0;j<N;j++)
    for(int k=W;w[j]<=k;k--)
        dp[k]=max(dp[k],dp[k-w[j]]+v[j]);

解題程式碼

#include<stdio.h>
int dp[10000+5],w[10000+5],v[10000+5];
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int N,W;
    scanf("%d
%d"
,&N,&W); for(int i=0;i<N;i++) scanf("%d%d",&w[i],&v[i]); //memset(dp,0,sizeof(dp));//注意如果多次使用一定要清零 for(int j=0;j<N;j++) for(int k=W;w[j]<=k;k--) dp[k]=max(dp[k],dp[k-w[j]]+v[j]); printf("%d\n",dp[W]); return 0; }

完全揹包問題
描述:有N種物品和一個容量為W的揹包,每種物品都有無限件可用。第i種物品的重量是W[i],價值是V[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

完全揹包問題核心遞推關係

for(int j=0;j<N;j++)
    for(int k=w[j];k<=W;k++)
        dp[k]=max(dp[k],dp[k-w[j]]+v[j]);

結語:完全01揹包問題和揹包問題程式碼上唯一的區別就是迴圈的方向不同