描述:
有几种不同的珍珠。每种珍珠都有它的单价。当然质量高的珍珠价格一定也是高的。
为了避免买家只买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;
}
}