求用动态规划法求解0/1背包问题 !!!

xiaomubiao 2004-05-05 12:18:12
问题描述:给定n种物品和一个背包,物品I的重量是Wi,其价值为Vi,背包的容量为c,问如何选择装入背包的物品,使得装入背包的物品的总价值最大?

形式化描述:给定c求一个n元1-0向量Xi(每种物品要么装要么不装)
Wi Xi(i从1到n连乘累加,Xi=0或1)〈=c
Vi Xi(i从1到n连乘累加,Xi=0或1) 达到最大
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnefuil 2004-05-05
  • 打赏
  • 举报
回复
设f(n,w)表示前n个物品装w公斤重时的最大价值
递推式为
f(i,w)=max{f(i-1,w),f(i-1,w-wi)+vi}
算法如下:
开始时候f(0,i)=0 0<=i<=c
for i=1 to n
f(i,0)=0
for j=1 to c
f(i,j)=f(i-1,j)
if w(i)<=j and f(i,j)<f(i-1,j-w(i))+v(i) then
f(i,j)=f(i-1,j-w(i))+v(i)
end j
end i
mmmcd 2004-05-05
  • 打赏
  • 举报
回复
for(int i=1;i<n;i++)
{
for(int j=0;j<=c;j++)
{
if(j+W[i]<=c && f[i-1][j]+V[i]>f[i][j+W[i]])
f[i][j+W[i]]=f[i-1][j]+V[i];
}
}

最大值是 max{ f[n-1][k] }(0<=k<=c)
打雷啦的专栏 2004-05-05
  • 打赏
  • 举报
回复
高级程序员教程里有,不过,是递归算法实现背包问题;

try(物品i,当前选择已达到的重量和tw,本方案可能到达的总价值tv)
{ /* 考虑物品i包含在当前方案中的可能性 */
if(包含物品i是可接受的)
{
将物品i包含在当前方案中;
if(i<n-1)
{
try(i+1,tw+物品i的重量,tv);
}
else
{
/*又一个完整方案,因此比前面的方案好,以它作为最佳方案*/
当前方案作为最佳方案保存;
}
恢复物品i不包含状态;
}
/*考虑物品i不包含在此方案中的可能性*/
if(不包含物品i仅是可能的)
{
if(i<n-1)
{
try(i+1,tw,tv-物品i的价值)
}
else
{
/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
以当前方案作为最佳方案保存;
}
}
}
jwd_1_cool 2004-05-05
  • 打赏
  • 举报
回复
楼上超超和怒剑给的都是 DP的啊!!
xiaomubiao 2004-05-05
  • 打赏
  • 举报
回复
c或c++
xiaomubiao 2004-05-05
  • 打赏
  • 举报
回复
各位能否提供一个“动态规划法的”的代码

忙着考研,不想调试了。谢谢

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧