描述:
有两艘船,载重量分别是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[11],b,f1[11],f2[11],cw; //cw是当前最优解,b是记录的最优解, void fun(int i) { if(i>n) { if(cw>b) { for(int j=1;j<=n;j++) f2[j]=f1[j]; b=cw; } return; } s-=w[i]; if(cw+w[i]<=c1){ f1[i]=1; cw+=w[i]; fun(i+1); cw-=w[i]; } if(cw+s>b) { f1[i]=0; fun(i+1); } s+=w[i]; } int main() { int i; while(1){ cin>>c1>>c2>>n; b=0; s=0; cw=0; if(c1==0&&c2==0&&n==0) break; for(i=1;i<=n;i++) {cin>>w[i];s+=w[i];} fun(1); if(s-b<=c2) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }