结果显示不对,不知道问题出在哪里
代码如下:
#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);
}
}
}