算法实验二 【装载问题】(回溯算法)
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。
输入样例
7 8 2
8 7
7 9 2
8 8
0 0 0
输出样例
Yes
No
#include<iostream>
#include<math.h>
using namespace std;
int c1,c2,n;//船的载重量和集装箱个数
int weight=0;//集装箱总重量
int a[10];//集装箱重量
int used[10];//集装箱是否被用过
int maxn,now;//能装入c1的最大值和当前值
void dfs(int m);
bool canplace(int m);
int main()
{
cin>>c1>>c2>>n;
while(n)
{
maxn=now=weight=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
weight+=a[i];
}
dfs(0);
if(weight-maxn<=c2) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
cin>>c1>>c2>>n;
}
return 0;
}
void dfs(int m)
{
if(m==n)
{
maxn=max(maxn,now);
}
else
{
if(canplace(m))
{
used[m]=1;
now+=a[m];
dfs(m+1);
used[m]=0;
now-=a[m];
}
dfs(m+1);
}
}
bool canplace(int m)
{
if(used[m]) return false;
else if(now+a[m]>c1) return false;
return true;
}
10.22日复习
这道题看着像是两个变量的题,但是其实是一个
找出能在第一艘船上装载的集装箱最大重量,如果总重量减去最大重量能在第二艘船放下,就输出Yes即可