HDU1300Pearls

传送门

描述:
有几种不同的珍珠。每种珍珠都有它的单价。当然质量高的珍珠价格一定也是高的。
为了避免买家只买1个珍珠。就要求不论是买了多少个珍珠都是需要在购买数量上加10.之后乘上单价。
例如:买5个单价是10的珍珠。需要的花费是((5+10)×10=150).买100个单价是20的珍珠花费是((100+10)×20=2200)
单价越大的珍珠可以顶替单价较小的珍珠
求出满足珍珠要求的最小花费。

sf

首先可以发现,如果用价值较大的去顶替价值较小珍珠的时候

要么划算,全部顶替

要么不划算,一颗都不顶替

然后,如果可以顶替价值较小珍珠还划算,那么去顶替价值稍大的珍珠也一定划算

但是反过来结论并不成立。

所以定义dp[i]为前i种的花费

每次枚举当前珍珠要往前顶替几种珍珠

如果没有注意到这个结论,那么就要枚举珍珠类别,枚举上一种珍珠选的个数,枚举这次要选的个数

不管时间还是空间都吃不消

#include <bits/stdc++.h>
using namespace std;
int shu[109],v[109],dp[109];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)	cin>>shu[i]>>v[i];
		memset(dp,20,sizeof(dp));
		dp[0]=0;
		for(int i=1;i<=n;i++)
		{
			int num=0;
			for(int j=1;j<=i;j++)//包括第i种的前j种
			{
				num+=shu[i-j+1];//要买这么多 
				dp[i]=min(dp[i],dp[i-j]+(num+10)*v[i]);
			} 
		}
		cout<<dp[n]<<endl;
	}
}
原文地址:https://www.cnblogs.com/iss-ue/p/12581566.html