noj算法 装载问题 回溯法

描述:

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

题解:

变形的01背包问题,先按最优解把c1装好,在看剩下的集装箱是否小于c2的容量。

代码:

#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
int c1,c2,n,s,w[],b,f1[],f2[],cw; //cw是当前最优解,b是记录的最优解, void fun(int i)
{
if(i>n)
{
if(cw>b)
{
for(int j=;j<=n;j++)
f2[j]=f1[j];
b=cw;
}
return;
}
s-=w[i];
if(cw+w[i]<=c1){
f1[i]=;
cw+=w[i];
fun(i+);
cw-=w[i];
}
if(cw+s>b)
{
f1[i]=;
fun(i+);
}
s+=w[i];
} int main()
{
int i;
while(){
cin>>c1>>c2>>n;
b=;
s=;
cw=;
if(c1==&&c2==&&n==) break;
for(i=;i<=n;i++) {cin>>w[i];s+=w[i];}
fun();
if(s-b<=c2)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return ;
}
上一篇:react.js CMS 删除功能的实现


下一篇:深入研究Java类装载机制