题意:不同等级的宝石,每个等级买了后等要额外付出10枚的钱,每一档可以买更高档的来代替,问全部宝石一共最少可花多少钱。
思路:一开始想的是贪心,然后发现不行;(别问为什么,你自己举个例子就会知道的);
f[i] = min{f[k] + (a[k+1] + a[k+2] ... +a[i] + 10) * p[i];
a[i]表示第i个class要买的数目
p[i]表示第i个class的单个价格
f[i]表示买到第i个时付的最少的钱(第i个一定要买)
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int MAXN = 108;
struct thing {
int a, p;
} fuck[MAXN];
int dp[MAXN];
int cmp(thing aa, thing bb) {
return aa.p < bb.p;
}
int main() {
int t, c, i, j;
scanf("%d", &t);
while(t--) {
scanf("%d", &c);
for(i = 1; i <= c; i++) {
scanf("%d%d", &fuck[i].a, &fuck[i].p);
}
//之前看见贪心错了,加了这个(不能加,加了就错,数据有点问题)
//sort(fuck+1, fuck+c+1, cmp);
for(i = 1; i <= c; i++) {
int tmp = fuck[i].a+10;
dp[i] = dp[i-1]+tmp*fuck[i].p;
for(j = i-1; j > 0; j--) {
tmp += fuck[j].a;
if (dp[i] > dp[j-1]+tmp*fuck[i].p)
dp[i] = dp[j-1]+tmp*fuck[i].p;
}
}
printf("%d\n", dp[c]);
}
return 0;
}