poj1260——pearls

来源:互联网 发布:bgm是什么意思网络用语 编辑:程序博客网 时间:2024/05/16 06:38

题目大意:有不同种珍珠,更好种类的更贵,购买每种珍珠时要付额外10个该种珍珠的钱。给出珍珠的购买清单,包括每种珍珠所需个数及每种珍珠的价格,只能买与所需珍珠质量相等或更好的,问怎么买花费最少。

输入:case个数

          casei的珍珠种类数c(1<=c<=100)

          第j种的所需数量aj 价格pj

输出:最小花费

分析:动态规划

          状态dp[i]:前i种珍珠可选时的最小花费

          结果:dp[n]

          初始化边界:dp[0]=0

          状态转移方程:dp[i]=dp[i-1]+(a[i]+10)*p[i]

                                枚举j优化dp[i]=min{dp[i],(sum[i]-sum[j]+10)*p[i]+dp[j]}

代码:转自http://www.bubuko.com/infodetail-477817.html

#include <algorithm>#include <iostream>#include <cstring>using namespace std;int n,a[110],p[110],dp[110],s[110];int main(){int T;scanf("%d",&T);    while(T--){scanf("%d",&n);s[0]=0;for(int i=1;i<=n;i++){scanf("%d%d",&a[i],&p[i]);s[i]=s[i-1]+a[i];}dp[0]=0;for(int i=1;i<=n;i++){dp[i]=dp[i-1]+(a[i]+10)*p[i];for(int j=0;j<i;j++)dp[i]=min(dp[i],dp[j]+(s[i]-s[j]+10)*p[i]);}printf("%d\n",dp[n]);}return 0;}