cf946 div3 E. Money Buys Happiness(01背包)

cf946 div3 E. Money Buys Happiness(01背包)

题目链接

思路

这题用背包来写的话容量(英镑)很大,不可行;题目给出价值总和不超过 1 0 5 10^5 105,所以可以用价值代表状态,属性就为该价值下所耗费的最小容量

代码

void solve(){
    int m,x;
    cin>>m>>x;
    ll h=0;
    vector<int> a(m),b(m);
    for(int i=0;i<m;i++) cin>>a[i]>>b[i],h+=b[i];
    vector<ll> dp(h+1,1e18);//dp[i]代表价值为i花费的最少钱
    dp[0]=0;
    for(int i=0;i<m;i++)
        for(int j=h;j>=b[i];j--)
            if(a[i]+dp[j-b[i]]<=(ll)i*x)
                dp[j]=min(dp[j],dp[j-b[i]]+a[i]);
    for(int i=h;i>=0;i--)
        if(dp[i]<1e18){
            cout<<i<<endl;
            return;
        }
    
}

你可能感兴趣的:(算法)