题意:买珍珠,每个类别的珍珠的价格不一样,每买一种价格的珍珠都必须多给10个珍珠的钱,低等的珍珠可以用高等的珍珠进行替代,问买完那些珍珠,最少花费的钱。
算法:dp动态规划,每种的珍珠都有两种状态在这类珍珠中购买,在比他等级高中购买。计算了如果他不在自己的等级中购买,那就在大于它的等级任意一个中购买。
不能使用贪心的原因是因为:有可能出现不只是只向上一个等级中购买。
代码:
#include <iostream>
using namespace std;
#include <stdlib.h>
struct pea
{
int geshu;
int price;
};
pea test[101];
int min(int a, int b)
{
return a<b?a:b;
}
int dp[101];
int main()
{
int t,i,j;
int geshu;
long total;
int cnt;
int minn;
scanf("%d",&t);
while(t--)
{
total=0;
scanf("%d",&geshu);
for(i=1;i<=geshu;i++)
scanf("%d%d",&test[i].geshu,&test[i].price);
using namespace std;
#include <stdlib.h>
struct pea
{
int geshu;
int price;
};
pea test[101];
int min(int a, int b)
{
return a<b?a:b;
}
int dp[101];
int main()
{
int t,i,j;
int geshu;
long total;
int cnt;
int minn;
scanf("%d",&t);
while(t--)
{
total=0;
scanf("%d",&geshu);
for(i=1;i<=geshu;i++)
scanf("%d%d",&test[i].geshu,&test[i].price);
dp[0]=0 ;
for(i=1;i<=geshu;i++)
{
minn=1000000000;//取小了还会wa的
cnt=test[i].geshu;
for( j=i-1; j>=0; j-- )
{
minn = min(minn,dp[j]+(cnt+10)*test[i].price);
cnt += test[j].geshu;
}
dp[i] = minn;
}
cout<<dp[geshu]<<endl;
for(i=1;i<=geshu;i++)
{
minn=1000000000;//取小了还会wa的
cnt=test[i].geshu;
for( j=i-1; j>=0; j-- )
{
minn = min(minn,dp[j]+(cnt+10)*test[i].price);
cnt += test[j].geshu;
}
dp[i] = minn;
}
cout<<dp[geshu]<<endl;
}
return 0;
}
return 0;
}
本文探讨了一种涉及不同类别珍珠购买的优化问题,并通过动态规划算法求解最小花费。文章详细介绍了算法思路及实现代码,指出该问题不适合采用贪心算法。
231

被折叠的 条评论
为什么被折叠?



