回溯法求解装载问题

operatingtuzi 2008-12-23 12:22:43
为了省事 很多都设成全局变量了

问题描述:有num个箱子 想要装到载重量为c的船上,要求装的尽可能重,输出最多装多重,以及选了哪些箱子


#include<iostream>
using namespace std;
int bestw=0; //当前最多载重量
int cw=0; // 当前载重量
int num=3; // 箱子数
int r=46; // 剩余箱子重量
int bestx[3]; //最重的情况下箱子的选择情况
void load(int *w,int c,int n,int *x)
{
if(n>=num)
{
if(cw>bestw)
{
for(int i=0;i<n;i++)
{ bestx[i]=x[i];
bestw=cw;
}
}
return ;
}

r-=w[n];
if(cw+w[n]<=c)
{
cw+=w[n];
x[n]=1;
load(w,c,n+1,x);
cw=cw-w[n];

}
if(cw+r>bestw)
{
x[n]=0;
load(w,c,n+1,x);
}
r+=w[n];
}
int main(void)
{int w[]={ 16,15,15};
int x[3]={0};
load(w,30,0,x);
cout<<bestw;
for(int i=0;i<num;i++)
cout<<bestx[i];
return 0;
}


算法描述如下:
Backtrack( int i )
{ //搜索第i层结点
如果到达叶结点,bestw=cw。
//修改剩余重量r
r = r-w[i]
//搜索左子树
如果当前剩余空间可以放下当前物品也就是, cw + w[ i ] <= c,则把当前载重 cw += w[ i ],递归访问其左子树,Backtrack( i + 1 ),访问结束,回到调用点, cw - = w[ i ]
//搜索右子树
如果剩余重量加上当前载重大于最优值,递归访问右子树, Backtrack( i + 1 )。

//回到上一层调用点
r = r+w[i]
}


正确输出:30 011
帮我改改 哪里错了
...全文
967 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
myoswin7 2008-12-27
  • 打赏
  • 举报
回复
算法没问题
楼主看看编译器吧
operatingtuzi 2008-12-25
  • 打赏
  • 举报
回复
怎么一直没人回答呢。。
我只好继续顶了。。
operatingtuzi 2008-12-24
  • 打赏
  • 举报
回复
up
sparkliang 2008-12-24
  • 打赏
  • 举报
回复
哦,看错了,还有一种情况,只有n >= num时的返回情况,应该考虑虽然n < num但是cw + w[n] > c的情况,这时候也有可能是最优接。
operatingtuzi 2008-12-24
  • 打赏
  • 举报
回复
顶上去
operatingtuzi 2008-12-23
  • 打赏
  • 举报
回复
不是的
cw是当前的重量 ,装上的时候, cw会改变,所以不用改变c
sparkliang 2008-12-23
  • 打赏
  • 举报
回复
if(cw+w[n]<=c)
{
cw+=w[n];
x[n]=1;
load(w,c,n+1,x);
cw=cw-w[n];

}
这个地方应该是load(w, c - w[n], n+1, x);吧,已经装上去了,容量要减去。
SearchLife 2008-12-23
  • 打赏
  • 举报
回复
up

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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