m0_57117352 2022-04-21 23:44 采纳率: 81.3%
浏览 33

轮船装载问题,回溯算法,结果显示错误

img


结果显示不对,不知道问题出在哪里

代码如下:
#include<stdio.h>
#define max 50
void rejust(int i,int cw,int bestw,int x[max],int bestx[max],int r,int w[max],int c1,int n);
void ShuChu (int bestx[max],int w[max],int c2,int n);
int main()
{
int c1,c2;//c1,c2为两艘船的最大载重
int bestw;//当前最优载重量
int cw;//当前扩展节点的载重量
int r=0;//剩余集装箱的重量
int bestx[100];//表示最优解
int w[max];//i节点的重量
int x[max];//0不放,1放
int n;//集装箱个数
int i;
printf("请输入集装箱的个数:");
scanf("%d",&n);
c1=c2=50;
printf("输入每个集装箱的重量");
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}

 for(i=1;i<=n;i++)
 {
     r=r+w[i];//初始集装箱的总重量 
 }
 rejust(1,cw,bestw,x,bestx,r,w,c1,n); 
 ShuChu(bestx,w,c2,n);

}
void rejust(int i,int cw,int bestw,int x[max],int bestx[max],int r,int w[max],int c1,int n)
{
int j;
if(i>n) //判断是否达到叶子节点
{
if(cw>bestw)
{
for(j=1;j<=n;j++)
{
bestx[j]=x[j];
}
bestw=cw;
}
}
r=r-w[i];
if(cw+w[i]<=c1) //判断该集装箱到底放不放
{
x[i]=1;
cw=cw+w[i];
rejust(i+1,cw,bestw,x,bestx,r,w,c1,n);
//当节点i的子树延伸结束时要返回i节点
x[i]=0;
cw=cw-w[i];

}
if(cw+r>bestw) //判断先不放该集装箱后是否还有可行解
{
    x[i]=0;
    rejust(i+1,cw,bestw,x,bestx,r,w,c1,n);
}
r=r+w[i];//当节点i的子树延伸结束时要返回i节点

}
void ShuChu (int bestx[max],int w[max],int c2,int n)
{
int c2w=0;
int i;
for(i=1;i<=n;i++)
{
if(bestx[i]==0)
{
c2w=c2w+w[i];
}
}
if(c2w>c2)
printf("装不下");
else
{
printf("轮船1装入的集装箱为:");
for(i=1;i<=n;i++)
{
if(bestx[i]==1)
printf("%d",i);
}
printf("轮船2装入的集装箱为:");
for(i=1;i<=n;i++)
{
if(bestx[i]!=1)
printf("%d",i);
}

}

}

  • 写回答

1条回答 默认 最新

  • 关注

    int w[max]; 长度是50,w[i]的下标i超过50了数组下标越界了,

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月21日

悬赏问题

  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?