问题描述
有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。
问题分析
如果给定一个装载问题有解,则采用下面的策略可得到最优装载方案:
(1)首先将第一艘轮船尽可能装满;
(2)将剩余的集装箱装上第二艘轮船。
#include<stdio.h>
#define max 12;
int c1,c2,n; //载重量分别是c1、 c2,n个集装箱
int weight;
int best;
int boxw[12];
void backtrack(int a)
{
if(a==n)
{
if(weight>best)
best=weight;
return ;
}
if(weight+boxw[a]<=c1)
{
weight=weight+boxw[a];
backtrack(a+1);
weight=weight-boxw[a];
}
backtrack(a+1);
}
int main()
{
while(1)
{
int sum=0;
printf("请分别输入两艘船的载重量及集装箱的个数:\n");
scanf("%d %d %d",&c1,&c2,&n);
if(c1==0&&c2==0&&n==0)
break;
for(int i=0;i<n;i++)
{
scanf("%d",&boxw[i]);
sum+=boxw[i];
}
best=weight=0;
backtrack(0);
if(sum-best<=c2)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}