您的位置:首页 > 其它

P2925 [USACO08DEC]干草出售Hay For Sale

2017-08-09 20:19 399 查看
QAQ

此题如果使用普通的01背包会超时,因此添加几条优化

1、由于需要从小到大遍历车的容量,假设车的容量是a,那么f[a]一定小于等于a

这说明当f[a]取a时就不用再一次对f[a]进行更新了

2、由于车的总容量为c,那么这辆车最多只能装体积为c的干草

因此如果已经可以装体积为c的干草就直接输出结果并退出

#include<iostream>
using namespace std;
int c,h;//c容量 h种情况
int f[50005];
int v[50005];
int main(){
cin >> c >> h;
for(int i = 1;i <= h;i++)
cin >> v[i];
for(int i=1;i<=h;i++){
for(int a = c;a >= v[i];a--){
if(f[a] == a)
continue;  //此时f[a]已经取到最大值 就不用再对f[a]进行更新
if(f[a-v[i]] +v[i]>f[a])
f[a]=f[a-v[i]]+v[i];
}
if(f[c] == c){//判断是否已经能够装满c体积的干草
cout << c;//能够装满
return 0;//退出
}
}
cout << f[c];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: