7-18 装载问题 (10 分)
有一批共n (n<100) 个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。
输入格式:
第一行输入三个数n,c1,c2(<=107);第二行输入n个数,第i个数表示第i个集装箱的重量wi(<=105)。
输出格式:
如果能成功装载输出“YES”,否则输出“NO”
输入样例:
2 9 9
10 8
输出样例:
NO
思路:直接用01背包给一只船装满 看剩下的能不能放到第二艘船上即可
#include <bits/stdc++.h>
using namespace std;
int max(int a,int b){ //返回最大值
if (a>b) return a;
return b;
}
int main(){
int c1,c2,n;
cin>>n>>c1>>c2;
int f[n+1][c1+1];
int w[n+1];
int i,count;
for (i=1;i<=n;i++){
cin>>w[i];
count+=w[i];
}
int j;
memset(f,0,sizeof(f));
for (i=1;i<=n;i++){//i表示选取前i项物体
for (j=1;j<=c1;j++){//j表示背包容量
if(j>=w[i]){//只有当背包容量大于当前物体的时候 我们才考虑把不把他装进背包 在容量够的前提下 还要考虑放不放进去
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+w[i]);
}
else {//背包容量放不进该物体那就不考虑该物体了删掉该物体考虑在j容量的前提下 前i-1件物体的最大价值
f[i][j]=f[i-1][j];
}
}
}
if(count-f[n][c1]>c2){
cout<<"NO"<<endl;
}
else {
cout<<"YES"<<endl;
}
return 0;
}