codeforces 1154F 揹包DP

codeforces 1154F


題意:

nk給定n把鏟子,你需要從中購買k把鏟子。
mixi使便yi另外有m種優惠,第i種優惠爲購買x_i把鏟子可以使得其中最便宜的y_i把鏟子免費。
k問購買k把鏟子的最少花費。


題解:

iw[i]i便sum[i]v[i]將第i種優惠前提視爲w[i],維護前i把最便宜鏟子價格的前綴和sum[i],前綴和的差值爲v[i],
將問題轉化爲完全揹包。
dp[i]idp[i]表示購買i把鏟子所得到的最大優惠。

  • 滿dp[j]=max(dp[j],dp[jw[i]]+sum[jw[i]+v[i]]sum[jw[i]])若購買的鏟子數量滿足優惠前提,dp[j] = max(dp[j], dp[j-w[i]]+sum[j-w[i]+v[i]]-sum[j-w[i]])

#include <bits\stdc++.h>
using namespace std;
const int N = 200001;
int a[N], w[N], v[N], sum[N];
int dp[N];

int main() {
    int n, m ,k;
    cin >> n >> m >> k;
    for(int i = 1 ; i <= n ; i++){
        cin >> a[i];
    }
    for(int i = 1 ; i <= m ; i++){
        cin >> w[i] >> v[i];
    }
    sort(a+1, a+1+n);
    for(int i = 1 ; i <= n ; i++){
        sum[i] = sum[i-1]+a[i];     
    }
    for(int j = 1 ; j <= k ; j++){
        for(int i = 1 ; i <= m ; i++){
            if(j >= w[i]){
                dp[j] = max(dp[j], dp[j-w[i]]+sum[j-w[i]+v[i]]-sum[j-w[i]]);
            }
        }
    }
    cout << sum[k]-dp[k] << endl;
    return 0; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章