7-27 装载问题 (10 分)
有一批共n (n<100) 个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。
输入格式:
第一行输入三个数n,c1,c2(<=10^7);第二行输入n个数,第i个数表示第i个集装箱的重量wi(<=10^5)。
输出格式:
如果能成功装载输出“YES”,否则输出“NO”
输入样例:
2 9 9 10 8
输出样例:
NO
作者
严华云
单位
湖州师范学院
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h> #define N 100 int c1,c2; int n; int w[N]; int flag[N]={0}; int r=0; int cw=0; int bw=0; int choose[N]; void backtrack(int i){ int j; if(i>n){ if(cw>bw){ bw=cw; for(j=1;j<=n;j++){ choose[j]=flag[j]; } } return ; } r-=w[i]; if(cw+w[i]<=c1){ cw+=w[i]; flag[i]=1; backtrack(i+1); cw-=w[i]; flag[i]=0; } if(cw+r>bw){ backtrack(i+1); } r+=w[i]; } int main() { int i,sum=0; scanf("%d %d %d",&n,&c1,&c2); for(i=1;i<=n;i++){ scanf("%d",&w[i]); r+=w[i]; sum+=w[i]; } backtrack(1); if(sum-bw<=c2){ printf("YES\n"); } else{ printf("NO\n"); } }