回溯法求解装载问题
为了省事 很多都设成全局变量了
问题描述:有num个箱子 想要装到载重量为c的船上,要求装的尽可能重,输出最多装多重,以及选了哪些箱子
算法描述如下:
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
帮我改改 哪里错了
问题描述:有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
帮我改改 哪里错了
...全文
相关推荐
算法分析设计回溯法求解装载问题实验报告.docx
算法分析设计回溯法求解装载问题实验报告.docx
算法分析设计回溯法求解装载问题实验报告.pdf.pdf
算法分析设计回溯法求解装载问题实验报告.pdf.pdf
最优装载回溯法求解........
最优装载回溯法求解最优装载回溯法求解最优装载回溯法求解最优装载回溯法求解
最优装载 回溯法
计算机算法设计与分析书本的最优装载问题 运用回溯法解答
子集树问题 试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。
Description 试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。 装载问题描述如下:有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。 Input 输入由多组测试数据组成。 每组测试数据输入的第一行有2个正整数n和c,n是集装箱数,c是轮船的载重量。接下来的1行中有n个正整数,表示集装箱的重量。 Output 对应每组输入,输出的每行是将计算出的最大装载重量。 Sample Input 5 10 7 2 6 5 4 Sample Output 10


