动态规划-背包问题
背包最大承受重量wmax
每个商品的重量w以及他们的价值为v
问,怎么样装,才能是价值最大!
如
编号 重量(w) 价值(v)
1 2 3
2 3 4
3 4 5
4 5 8
5 9 10
|| B(k-1,wmax) //第k件太重
||
B(k,wmax) = || || 继续装 B(k-1,wmax-wk)+vk
|| 两者最大值max ||
|| || 停止装商品 B(k-1,wmax)
#include<iostream>
using namespace std;
#define N 6
#define W 21
int B[N][W] = {0};
int w[6] = {0,2,3,4,5,9};
int v[6] = {0,3,4,5,8,10};
int dp()
{
int k,c; //k表示第5个商品,c表示背包前剩余最大容量
for(k=1;k<N;k++)
{
for(c = 1;c<W;c++)
{
if(w[k]>c) //如果第k件商品 比 当前剩余最大容量大 ,装不下
{
B[k][c] = B[k-1][c]; //停止装k件,总价值即是上一步的价值
}
else
{ //可以继续装
int value1 = B[k-1][c-w[k]]+v[k]; //装,剩余最大容量减去第k件的容量,需要加上第k件的价值
int value2 = B[k-1][c]; // 不装
if(value1 > value2) //比较装与不装哪个价值大
{
B[k][c] = value1;
}
else
{
B[k][c] = value2;
}
}
}
}
}
int main()
{
dp();
printf("%d",B[5][20]);
return 0;
}
参考:
https://v.youku.com/v_show/id_XMTQ3MzI0NzI2OA==.html?spm=a2h0k.11417342.soresults.dtitle