qwertyxk | 1260 | Accepted | 168K | 0MS | C++ | 585B | 2012-12-30 16:49:55 |
动态规划题 ,这个动态规划只需要记住此式即可
dp[i]=min(dp[i],(sum[i]-sum[i-1]+10)*p[i]+dp[i-1])
其中dp[i]是购买前i类的价钱,sum[i]为前i类物品的总数,先一起买,然后再分开购买,从i-1推到0的状况,取所有可能性中值最小的
i-1在遍历中看成j
源代码如下:
#include<stdio.h>
#include<memory.h>
#define MAX 9999999
int a[105],p[105],sum[105],dp[105];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int c,i,j;
scanf("%d",&c);
memset(sum,0,sizeof(sum));
memset(dp,MAX,sizeof(dp));
for(i=0;i<c;i++)
{
scanf("%d%d",a+i,p+i);
if(i==0)
sum[i]=a[i];
else
sum[i]=sum[i-1]+a[i];
}
for(i=0;i<c;i++)
{
dp[i]=(sum[i]+10)*p[i]; \\每次先一起购买,然后下面看再分开购买的情况
for(j=0;j<i;j++) \\从i-1开始把类都分出去,前面的0到j分成一波购买,然后j+1到i分成一波来购买
{
int tmp=(sum[i]-sum[j]+10)*p[i]+dp[j];
dp[i]=dp[i]<tmp?dp[i]:tmp;
}
}
printf("%d\n",dp[c-1]);
}
return 0;
}