#include "stdio.h"
#include "stdlib.h"
#define MAX 10
int n; //集装箱个数
int c; //第一艘的载重
int x[MAX]; //临时解向量空间
int bestx[MAX]; //最优解向量空间
int w[MAX]; //集装箱重量
int cw; //当前载重
int r; //第一艘船剩余载重
int bestw; //最优载重
//搜索子集树,寻求最优解
void backtrack(int i)
{
if(i>=n) //如果达到叶子节点
{
if(cw > bestw) //如当前解更优
{
int j;
for(j=0; j<n; j++)
bestx[j] = x[j]; //赋值最优解向量空间
bestw = cw; //更新最优解
}
}
else //搜索子树
{
r -= w[i]; //装入下一个集装箱后,当前剩余载重减少
if(cw+w[i] <= c) //如果装入下一个集装箱不会超出第一艘船载重,则搜索左子树
{
cw += w[i]; //当前载重增大
x[i] = 1; //当前集装箱被装入
backtrack(i+1); //继续搜索下一个结点
cw -= w[i]; //回到上一个结点
}
if(cw+r > bestw) //如果当前载重加上第一艘船的剩余载重超过最优解,则搜索右子树
{
x[i] = 0; //当前集装箱未被装入
backtrack(i+1); //继续搜索下一个结点
}
r += w[i]; //回到上一个结点
}
}
//返回第一艘船所能装载的最大重量
void maxLoading(int w1[], int n1, int c1)
{
int i;
for(i=0; i<n1; i++)
w[i] = w1[i];
n = n1;
c = c1;
r = cw = bestw = 0;
for(i=0; i<n; i++)
r += w[i];
backtrack(0);
}
int main(){
int i;
int w1[] = {10, 40, 40};
int n1 = 3;
int c1 = 50;
int c2 = 50;
maxLoading(w1, n1, c1);
printf("两艘船的载重分别为:%d, %d\n", c1, c2);
printf("集装箱个数为:%d\n", n);
printf("重量分别为:");
for(i=0; i<n; i++)
printf("%d ", w[i]);
printf("\n");
int rw = 0; //没有装入第一艘船的集装箱总重量
for(i=0; i<n; i++)
if(bestx[i]==0)
rw += w[i];
if(rw>c2) //如果大于第二艘船载重
printf("不能将全部集装箱都装入两艘船!\n");
else
{
printf("装载成功!\n装入第一艘船的集装箱为:\n");
for(i=0; i<n; i++)
if(bestx[i]==1)
printf("%d(%d)\t", i+1, w[i]);
printf("\n");
printf("第一艘船目前载重为:%d\n", bestw);
}
return 0;
}
装载问题
最新推荐文章于 2023-12-02 17:33:07 发布