【回溯】装载问题

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 int c1,c2,n;
 4 int w[1000],s[1000],bs[1000];
 5 int mw=0;
 6 void max(int c,int i,int cw)
 7 {
 8     if(i==n)
 9     {
10         if(cw>mw)
11         {
12             mw=cw;
13             int j;
14             for(j=0;j<n;j++)
15                 bs[j]=s[j];
16         }
17     }else{
18     if(c>=w[i]&&s[i]==0)
19     {
20         c-=w[i];
21         s[i]=1;
22         cw+=w[i];
23         max(c,i+1,cw);
24         c+=w[i];
25         s[i]=0;
26         cw-=w[i];
27     }
28     max(c,i+1,cw);
29     }
30 }
31 int main()
32 {
33     scanf("%d%d%d",&c1,&c2,&n);
34     while(c1!=0||c2!=0||n!=0)
35     {
36     int i;
37     bool flag=true;
38     for(i=0;i<n;i++)
39         scanf("%d",&w[i]);
40     for(i=0;i<n;i++)
41         s[i]=0;
42     for(i=0;i<n;i++)
43         bs[i]=0;
44     max(c1,0,0);
45     mw=0;
46     int l=0;
47     for(i=0;i<n;i++)
48     {
49         if(bs[i]==0)
50         {
51             l+=w[i];
52         }
53     }
54     if(l<=c2)
55         printf("Yes
");
56     else 
57         printf("No
");
58     scanf("%d%d%d",&c1,&c2,&n);
59     }
60     return 0;
61 }

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


提示
求出不超过c1的最大值max,若总重量-max < c2则能装入到两艘船

原文地址:https://www.cnblogs.com/zhouyee/p/4444893.html