有一批概共n个集装箱要装上两艘载重量分别为c1和c2的轮船,其中,集装箱i的重量为wi,且。
装载问题要求确定是否有一个合理的装载方案可将这n个集装箱装上这两艘轮船。
容易证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案:
1. 首先将第一艘轮船尽可能装满;
2. 将剩余的集装箱装上第二艘轮船
用深搜可以很容易解决,主要是剪枝,当当前所累加的重量大于船重量时,这条行不通,剪掉。遍历所有箱子,更新最优值。
#include <stdio.h>
int n,c1,c2;
int priority;
void loading(int cnt, int sum, int w[])
{
if( sum > c1 ) ///剪枝
return;
if( cnt >= n )
{
if( sum > priority ) ///更新
priority = sum;
return;
}
loading(cnt+1,sum+w[cnt],w); ///把当前箱子装上船
loading(cnt+1,sum,w); ///不把当前箱子装上船
}
int main()
{
int t;
scanf("%d", &t);
for( int i = 1; i <= t; i++ )
{
scanf("%d%d%d",&n, &c1, &c2);
int w[n], sum = 0;
for( int j = 0; j < n; j++ )
{
scanf("%d", &w[j]);
sum+=w[j];
}
priority = -1;
loading(0,0,w);
if( sum - priority <= c2 )
{
printf("Case %d:\n%d\n", i, priority);
}
else
printf("Case %d:\nNo\n",i);
}
return 0;
}