P2925 [USACO08DEC]干草出售Hay For Sale

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值