用回溯法解决背包问题,小弟愚笨,大家给个思路吧

wilcox1937 2003-11-22 03:04:17
如题,谢谢
...全文
222 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wilcox1937 2003-11-28
  • 打赏
  • 举报
回复
我还是认为那个不是用的回溯法,不过我这边的问题解决了,还是谢谢各位的指导,结帐
wilcox1937 2003-11-24
  • 打赏
  • 举报
回复
哪位给解释下哈,多谢~~~
v_salt 2003-11-24
  • 打赏
  • 举报
回复
01背包还是别的?
levinjoe 2003-11-24
  • 打赏
  • 举报
回复
仔细看了一下,是回溯啊!
依次判断如果满足结束条件,满足的话比较是否比当前最大的大,大的话修改当前最大并退回!--------回溯
设置当前物品不选,继续;
如退回设置选,继续!
这种算法其实近似遍历所有选择,只是加了一个边界检测优化,楼主不要死扣回溯,这也符合回溯的算法思想,你把它看成如下的树就明白了;
root
0 1
0 1 0 1
........

你写成非递归就明白了!
LeeMaRS 2003-11-24
  • 打赏
  • 举报
回复
-.-b 为什么说不是回溯法?
wilcox1937 2003-11-24
  • 打赏
  • 举报
回复
程序看懂了,不是回溯法呀,我说的没错饿。麻烦大家再帮帮忙。
michaelli 2003-11-23
  • 打赏
  • 举报
回复
本来想给你写个源程序的,楼上的兄弟已经写好了
:)
wilcox1937 2003-11-23
  • 打赏
  • 举报
回复
楼上的,题目要求用回溯,上次要求用贪心法,也只好做了
LeeMaRS 2003-11-23
  • 打赏
  • 举报
回复
loewe的很明显就是回溯法啊...
caohoujie 2003-11-23
  • 打赏
  • 举报
回复
为什么要用回搠?
这题应该用动态
规划法啊!?
wilcox1937 2003-11-23
  • 打赏
  • 举报
回复
loewe(可怜没人爱),这样不是用回溯法做的吧,要求用回溯法,不过还是谢谢你.
aaalife 2003-11-22
  • 打赏
  • 举报
回复
你说你那一点不明白?

列出来



八皇后 的问题你懂了嘛??
如果懂了,背包 应该没什么问题啊


ZhangYv 2003-11-22
  • 打赏
  • 举报
回复
GOOGLE
SoftWare1999 2003-11-22
  • 打赏
  • 举报
回复
没什么思路啊,
如果背包不满,就在加入一个。
满了就回溯,卸载上一个装的。
SoftWare1999 2003-11-22
  • 打赏
  • 举报
回复
思想上应该是先按照效益比递减排序,比如说现在有5,4,3,2,1排好,先定个约束条件,然后一步步想下,5->4->.......如果当取到2时不满足约束条件了,就回溯到3,
这里没错,只不过吧3再设成不装,
再2->1,当3回溯完,再回溯到4。

loewe 2003-11-22
  • 打赏
  • 举报
回复
#include<iostream.h>
#define N 5
int w[N],p[N],save[N],cop[N],Max; //w[i]表示第i个物品的重量,p[i]是其价值
void Search(int i,int weight,int R) //weight 表示剩余可放重量,R表示当前已经转载的重量
{
if(i==N || weight==0)
{
if(R>Max)
{
Max=R; //最大
for(int k=0;k<N;k++)
save[k]=cop[k]; //记录哪些物品被放入背包,1表示放入
}
return ;
}
else
{
if(w[i]<weight)
{
cop[i]=1;
Search(i+1,weight-w[i],R+p[i]);
cop[i]=0;
Search(i+1,weight,R);
}
else
Search(i+1,weight,R);
}
}
void main()
{
int i,weight;
cout<<"Weight = ";
cin>>weight;
for(i=0;i<N;i++)
{
cop[i]=0;
cout<<"The "<<i<<" : "<<endl;
cin>>w[i]>>p[i];
}
Max=0;

Search(0,weight,0);
cout<<endl<<"Max = "<<Max<<endl; //结果

for(i=0;i<N;i++)
if(save[i]!=0)
cout<<i<<"\t";
}


用了以下数据测试:
weight = 40
w: 8 16 21 17 12
p: 8 14 16 11 7

结果是:
Max = 30
1 2
wilcox1937 2003-11-22
  • 打赏
  • 举报
回复
思想上应该是先按照效益比递减排序,比如说现在有5,4,3,2,1排好,先定个约束条件,然后一步步想下,5->4->.......如果当取到2时不满足约束条件了,就回溯到3,从3开始有3->1->2,当3回溯完,再回溯到4。可是具体用代码实现起来我有点麻烦,我要请教各位的就是这个。多谢,但愿我表达的还够清楚。
stephen85 2003-11-22
  • 打赏
  • 举报
回复
up

33,028

社区成员

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

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