codeforces 19b 01背包

题意:给出一些商品,每一件商品有两个属性:ti和ci,表示以ci的代价购买了该商品之后,你可以从其他的物品中无偿(不支付代价)地挑选出ti个物品。求能够获得所有商品的最小代价

题解:对于第i件物品,相当于用pi的价格拿走ti+1件物品,最后的目的是用最少的钱拿走n件物品,把ti+1看作第ii件物品的体积,那么问题转化为n件物品,从中选出若干件使得其体积不小于n且总价值最小,即为01背包问题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn = 2005;
int n, t[maxn], p[maxn];
ll dp[maxn];
int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++){
    	scanf("%d %d", &t[i], &p[i]);
		t[i] ++;
		dp[i] = 1e18;	
	}
    for(int i = 1; i <= n; i ++)
        for(int j = n; j >= 1; j --)
            dp[j] = min(dp[j], dp[max(j - t[i], 0)] + p[i]);
    printf("%I64d\n", dp[n]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86564553