装载问题(回溯_子集树)

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

有两艘船,载重量分别是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

#include<stdio.h>
int c1,c2,n,w[10];//待输入数据
int weight=0,max=0;
void search(int m)//0,1,2...n
{
    if(m==n)
    {    if(weight<=c1 )//船一放得下
           if(weight>=max)//能放更多到船一
                 max=weight;
    }
    else
    {   if(weight+w[m]<=c1)//取重量为w[m]的集装箱(满足取的条件)
        {   weight += w[m];
            search(m+1);
            weight -=w[m];
        }
        search(m+1);//不取重量为w[m]的集装箱(不满足取的条件或满足也不取)
    }
}
int main()
{
    int i,sum=0;
    scanf("%d%d%d",&c1,&c2,&n);//船一,船二的载重c1,c2,集装箱的个数n    
    while(n!=0)
    {
        for(i=0;i<n;i++)
        {    scanf("%d",&w[i]);//每个集装箱重量
            sum += w[i];//集装箱总重量
        }
        search(0);        
        if(sum-max<=c2)
            printf("Yes\n");
        else
            printf("No\n");

        max=0;
        sum=0;
        scanf("%d%d%d",&c1,&c2,&n);    
    }
    return 0;
}
原文地址:https://www.cnblogs.com/IThaitian/p/2585425.html