有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。
输入:
多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。
输出:
对于每个测例在单独的一行内输出Yes或No。
输入样例:
7 8 2 8 7 7 9 2 8 8 0 0 0
输出样例:
Yes No
与01背包类似 - 先把一个船尽量装最多,剩下的重量小于第二个船则可以装下
#include<stdio.h>
int w[100];
int a[100];
int n,c1,c2;
int max;
void cmax()
{
int i,weight=0,value=0;
for(i=0;i<n;i++)
{
if(a[i]==1)
{
weight=weight+w[i];
}
}
if(weight<=c1&&weight>max)
max=weight;
}
void search(int m)
{
if(m==n)
{
cmax();
}
else
{
a[m]=0;
search(m+1);
a[m]=1;
search(m+1);
}
}
int main()
{
int i;
while(scanf("%d %d %d",&c1,&c2,&n))
{
max=0;
int k=0;
if(n==0&&c1==0&&c2==0)
{
return 0;
}
for(i=0;i<n;i++)
{
scanf("%d",&w[i]);
k+=w[i];
}
search(0);
if(k-max<=c2)
printf("Yes\n");
else
printf("No\n");
}
}