描述:
有两艘船,载重量分别是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<iostream>
- usingnamespacestd;
- intmain()
- {
- intc1,c2,n;
- while(1)
- {
- intstate=0;
- cin>>c1>>c2>>n;
- if(c1==0&&c2==0&&n==0)
- return0;
- while(n)
- {
- intwi;
- cin>>wi;
- if(wi<=c1||wi<=c2)
- {
- if(wi>c1)
- c2=c2-wi;
- elseif(wi>c2)
- c1=c1-wi;
- else
- {
- if(c1-wi>c2-wi)
- c1=c1-wi;
- else
- c2=c2-wi;
- }
- if(c1<0||c2<0)
- {
- cout<<"No"<<endl;
- intstate=1;
- break;
- }
- }
- else
- {
- cout<<"No"<<endl;
- state=1;
- break;
- }
- n--;
- }
- if(c1<0||c2<0)
- cout<<"No"<<endl;
- if(state==0)
- cout<<"Yes"<<endl;
- }
- return0;
- }
当然也可以用这种思想去做:求出不超过c1的最大值max,若总重量-max < c2则能装入到两艘船。
在求max的时候用到回溯法,物品只有两种状态,那么放进去要么没放在这个集装箱里。
代码如下:
- #include<iostream>
- usingnamespacestd;
- constintmax(12);
- intc1,c2,n;
- intweight;
- intbest;
- intboxw[max];
- voidbacktrack(inta)
- {
- 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);
- }
- intmain()
- {
- while(1)
- {
- intsum=0;
- cin>>c1>>c2>>n;
- if(c1==0&&c2==0&&n==0)
- break;
- for(inti=0;i<n;i++)
- {
- cin>>boxw[i];
- sum+=boxw[i];
- }
- best=weight=0;
- backtrack(0);
- if(sum-best<=c2)
- cout<<"Yes"<<endl;
- else
- cout<<"No"<<endl;
- }
- return0;
- }