题目链接:HDOJ 1300
题意啊,不再赘述了,只要注意每种都要有额外的10件成交,并且没件需求只能由品质更高的替代才行。。。
直接上代码吧,和龟兔赛跑那题差不多,枚举第i种之前已完成最优解状态,中间都用这种品质替代,更新当前最优解。
代码:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define Max(a,b) ((a>b)?a:b)
#define Min(a,b) ((a<b)?a:b)
#define debug 0
#define M(a) memset(a,0,sizeof(a))
#define INF 1<<28
const int maxn = 100 + 5;
int n,num[maxn],dp[maxn];
struct R
{
int c;
int w;
}r[maxn];
void Do(){
for(int i = 2;i <= n;i++)
{
int temp = INF;
for(int j = 1;j <= i;j++)//枚举子状态
{
int t = num[i] - num[j - 1];//j->i类的需求都可以用类i满足,因为物品质量是递增的
temp = Min(temp,(t + 10) * r[i].w + dp[j - 1]);
}
dp[i] = temp;
}
printf("%d\n",dp[n]);
}
int main(){
#if debug
freopen("in.txt","r",stdin);
#endif //debug
int T;
scanf("%d",&T);
while (T--)
{
M(num);
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&r[i].c,&r[i].w);
num[i]=num[i - 1]+r[i].c;//num[i]计数
}
dp[1] = (num[1] + 10) * r[1].w;//第一种初始化
Do();
}
return 0;
}