揹包問題入門 01揹包和完全揹包
阿新 • • 發佈:2019-01-30
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揹包問題和揹包問題程式碼上唯一的區別就是迴圈的方向不同