1005.装载问题
时限: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。
#include <iostream>
using namespace std;
//思路:将c1尽量填满,剩下的若能都装进c2,则成功
//因此只需找到一个可行解,不需深搜所有解,故dfs函数有bool返回值
int c1,c2; //两个载重量
int n; //集装箱个数
int w[11]; //集装箱重量
int wn1; //当前装入c1的重量
int wn; //总重量
bool dfs(int m);
bool owC1(int m); //判断当前c1是否超重
bool owC2(); //判断最终解中c2是否超重
int main()
{
cin>>c1>>c2>>n;
while(n!=0){
//初始化
wn1=wn=0;
//输入
for(int i=0;i<n;i++){
cin>>w[i];
wn+=w[i];
}
if(dfs(0))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
cin>>c1>>c2>>n;
}
return 0;
}
bool dfs(int m)
{
if(m==n){ //C1装载完毕
if(!owC2()) //若C2未超重
return true; //则找到一个可行解
}
else{
if(!owC1(m)){
wn1+=w[m];
if(dfs(m+1))return true; //若找到可行解便返回
wn1-=w[m];
}
if(dfs(m+1))return true;
return false;
}
return false; //此句无用,仅为消warning
}
bool owC1(int m) //判断c1是否超重
{
if(wn1+w[m]>c1)
return true;
else
return false;
}
bool owC2() //判断c2是否超重
{
int wn2=wn-wn1; //总重量-c1中重量=剩余重量
if(wn2>c2)
return true;
else
return false;
}