您的位置:首页 > 其它

01背包问题

2017-03-17 13:41 134 查看
用自己的话解读一下这个问题。

借鉴了两篇文章
https://my.oschina.net/llmm/blog/117421 http://blog.csdn.net/mu399/article/details/7722810
01背包问题就是在有限的空间里面得到最大价值

有动态方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

意思是,当要放入第i个物品时,最大价值取决于2个方案的选择

1、加入第i个物品,f[i,j]  等于 加入i之前的最大值 f[i-1,j-Wi] ,加上i的价值Pi(Wi为i的重量)

2、不加入第i个物品,f[i,j] 等于 不加入i之前的最大值f[i-1,j]

结果取1、2中最大值。这是一个递归问题。

题目:

有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?

nameweightvalue
a26
b23
c65
d54
e46
取数组goods_w[5] = {2,2,6,5,4}    goods_v = {6,3,5,4,6}
当i  = 0时,可以选择a,b,c,d,e,当i= 1时,可以选择b,c,d,e,当i= 4时,只能选择e

当i = 4时,背包重量从1到10,结果为

nameweightvalue12345678910
e460006666666
当bagsize 小于4时,放不了e,最大值为0 ,大于4时,因只有e一个物品可以选择,为0
当i = 3 时,可以有e,d两个物品选择。bagsize小于4,放不了东西,最大值为0,当bagsize=5时,

有d,e两个物品可以2选1。调用动态方程f (3,5)=

1、放入d,f(i-1,j-Wi)+Pi = f (4,5-5) + 4 , f(4,0) = 0, 则放入d的最大值为4

2、不放入d,f(i-1,j) = f(4,5) = 6 

方案2>方案1

同理可以得到

nameweightvalue12345678910
a26066991212151515
b23033669991011
c65000666661011
d54000666661010
e460006666666
c 代码如下,写的比较简陋。

#include <stdio.h>

int get_value(int i,int bagsize);

int goods_w[5] = {2,2,6,5,4};
int goods_v[5] = {6,3,5,4,6};

int get_value(int i, int bagsize)
{
if (i > 4)
{
return 0;
}
int a = get_value(i+1,bagsize);
int b = 0;
if (bagsize >= goods_w[i])
{
b = get_value(i+1,bagsize-goods_w[i])+ goods_v[i];
}
return a>b?a:b;
}

int main()
{
for(int i = 1;i<=10;i++)
{
printf("bagsize is :%d\n",i);
for (int j =0;j<=4;j++)
{
int x = get_value(j,i);
printf("max:%d\n",x);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: