本题的大意是,用不同品质的珍珠做项链,但是对于每个品质的珍珠,会加收是10个的费用,例如,选用10欧元的珍珠5个,那么最终的费用是(5+10)*10 。但是有时用高档次的珍珠替代低档次的珍珠可以减少总费用。需要给给出的数据,求出最小的费用。
刚开始想的过于简单,认为低档次的转化为高一档次的珍珠,然后再将高一档次的珍珠转化为更高档次的,依次类推可以的到最优解。但是贪心算法是错误的,因为第i档次的珍珠可能不能用第i+k的珍珠代替,但是可能存在第i档次的珍珠和第i+j的珍珠只和小于同等数量的i+k档的珍珠:
即(xi+10)*pi+(xi+1 +10 )*pi+1+·····+(xk+10)*pk<=(xi+····+xk+10)*pk
因此,可以设一状态d(i)表示,i档能的到的最小费用,状态转移方程:d(i)=min{d(k)+(a[k+1]+····+a[i]+10)*p[i]};
#include "stdio.h"
#define INF_MAX (1<<30)
#define MIN(a,b) ((a<b)?(a):(b))
long d[110];
int pi[110];
int ai[110];
int main()
{
int n,c;
int i,j;
long sum;
int cnt;
//freopen("test.txt","r",stdin);
scanf("%d",&n);
while(n--)
{
scanf("%d",&c);
for(i=1;i<=c;i++)
{
scanf("%d %d",&ai[i],&pi[i]);
}
d[0]=(ai[0]+10)*pi[0];
for(i=1;i<=c;i++)
{
cnt=ai[i];
sum=INF_MAX;
for(j=i-1;j>=0;j--)
{
sum=MIN(sum,d[j]+(cnt+10)*pi[i]);
cnt+=ai[j];
}
d[i]=sum;
}
printf("%ld\n",d[c]);
}
return 0;
}
测试数据:
3
11 10
50 11
100 12
6
50 4
65 20
37 25
80 30
100 50
35 70
10
50 4
11 10
50 11
100 12
65 20
25 21
37 25
80 30
100 50
35 70
5
65 20
30 21
40 25
80 30
10 50
结果:
2052
14200
16852
7105