http://poj.org/problem?id=1260
题意 :这个题大概是讲,给你几种等级不同的珠宝,然后告诉你它的数量和价值,等级是升序排列的,且随等级的升高价值也随之升高,但为了防止有的客户只购买一个珍珠,所以无论买哪一种的珍珠必须额外付这个等级珍珠的10倍的价钱,要求买够它给定的珍珠的种数中每一种珍珠的数量的总和,要求花费最小,等级低的可以用等级高的代替掉。
思路 : 典型的动态规划,就是求一个最优解嘛,这个题倒不什么难,就是思路对很重要,看了大神的解题报告,0MS,挺好的 。
样例解释 : 样例中最开始的2代表的是测试样例的组数,然后是珍珠的种数,等级按升序排列,然后第一组样例中按照题意可以求出两个结果,一个是(100+10)*1+(100+10)*2 = 330,另一个是(100+100+10)*20 = 4200,显然第一种方法比较优,所以输出330,同理,第二种样例中,(1+10)*10+(1+10)*10+(100+10)*12 =1561,(1+1+10)*11+(100+10)*12=1452,(1+1+100+10)*12 =1344,所以最优解是1344
2 2 100 1 100 2 3 1 10 1 11 100 12
#include<cstdio> #include<iostream> #include<cstring> using namespace std ; const int maxn = 1050 ; int main() { int n,m ; cin>>m; int ai[maxn],pi[maxn],ans[maxn],sum[maxn] ; for(int k = 0 ; k < m ; k++) { memset(ans,0,sizeof(ans)) ;//ans数组最优状态记录 sum[0] = 0 ; cin>>n ; for(int i = 1 ; i <= n ; i++) { cin>>ai[i]>>pi[i] ; sum[i] = sum[i-1]+ai[i] ;//sum数组存的是前i的珠宝总数 ans[i] = (sum[i] +10)*pi[i] ;//先将可能最优解存入 } for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= i ; j++) ans[i] = min(ans[i],(sum[i]-sum[j]+10)*pi[i]+ans[j]) ; cout<<ans[n]<<endl ; } return 0 ; }