题意:给出一些商品,每一件商品有两个属性: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;
}