POJ1260

要买若干种价值的珍珠,但买某种珍珠必须多付10颗此种珍珠的价钱,及如果买价值为1的珍珠100颗,必须付的钱数为110。一颗珍珠可以用比它贵的珍珠 充数,因此买多种珍珠的时候用贵的代替便宜的可能更省钱。

例一:

3

1 10

1 11

100 12

需要买第一类1个,第二类1个,第三类100个

一般情况下 (1+10)*10 + (1+10)*11 + (100+10)*12 = 1551元(一共买了102个珍珠)

但是如果全部都购买第三类珍珠,同样是买102个,而且其中总体质量还被提高了,但是价格却下降了:(102+10)*12 = 1344元

例二:

2

100 1

100 2

一般情况下(100+10)*1 + (100+10)*2 =330元

但是全部都购买第二类珍珠,同样买200个,虽然总体质量提升了,但是价格也提高了: (202+10)*2=424元

 1 /*首先是O(n^3)的方法,类似于矩阵连乘*/
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <string.h>
 5 using namespace std;
 6 int main(){
 7     int t,n,a[105],p[105],sum[105],dp[105][105];
 8     scanf("%d",&t);
 9     while(t--){
10         scanf("%d",&n);
11         sum[0]=0;
12         for(int i=1;i<=n;i++){
13             scanf("%d%d",a+i,p+i);
14             sum[i]=sum[i-1]+a[i];
15
16         }
17         for(int j=1;j<=n;j++){
18             for(int i=j;i>=1;i--){
19                 if(j==i)dp[i][i]=(a[i]+10)*p[i];
20                 else{
21                     dp[i][j]=(sum[j]-sum[i-1]+10)*p[j];
22                     for(int k=i;k<j;k++){
23                         dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
24                     }
25                 }
26             }
27         }
28         printf("%d\n",dp[1][n]);
29     }
30 }
 1 /*然后是O(n)的方法*/
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <string.h>
 5 using namespace std;
 6 int main(){
 7     int t,n,a[105],p[105],sum[105],dp[105];
 8     scanf("%d",&t);
 9     while(t--){
10         scanf("%d",&n);
11         sum[0]=0;
12         for(int i=1;i<=n;i++){
13             scanf("%d%d",a+i,p+i);
14             sum[i]=sum[i-1]+a[i];
15
16         }
17         dp[0]=0;
18         for(int i=1;i<=n;i++){
19             dp[i]=(a[i]+10)*p[i]+dp[i-1];
20             for(int j=0;j<i;j++){
21                 dp[i]=min(dp[i],(sum[i]-sum[j]+10)*p[i]+dp[j]);//寻找最好的分割点
22             }
23         }
24         printf("%d\n",dp[n]);
25     }
26 }
时间: 2024-10-15 03:55:14

POJ1260的相关文章

acm poj1260 dp

题目大意: 买珍珠,每买一种珍珠需要额外付出十个这种珍珠的钱,但你可以买比这种珍珠高品质的珍珠来替换它(那么就只需要那高品质付出那额外的十个珍珠的钱了,但是每个珍珠的价钱也变化了) 这是一个dp. 令dp[i]为只买前i种珍珠的最少花费钱数, 状态转移方程为dp[i] = min(dp[i],dp[j]+sum); 这里j<i, sum为j之后到i种珍珠均用第i种珍珠替换所需要的钱数: sum是很好解决的. 那么有人问了,这个状态转移只能求第i种只替换前面连续种珍珠的情况,如果是像1和3都用第三

poj1260——线性dp

poj1260——线性dp Pearls Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7705   Accepted: 3811 Description In Pearlania everybody is fond of pearls. One company, called The Royal Pearl, produces a lot of jewelry with pearls in it. The Royal

poj1260题解

1.题意:有n种珍珠,价格为pi,数量为ai,每种珍珠买的时候数量总数要加10:质量低的可以被质量高的替代: 2.错误思路:从最低的开始计算是否可以被下一个替代,如果可以就把这个的数量加到下一个上,不能则ans+=(ai+10)*pi; 3.这是错误..的错误 错误,比如 10 105  1510 23 此时,假设我们判断的时候,20*10>15*10我们应该把10加到5上,然后又会发现15需要加到下一个,感觉没什么问题..但,此时相当于,将第一类用第三类代替,明显不划算, 并且最优应该第一类不

POJ1260 Pearls Dynamic Programming

题意 有很多不同价格的珍珠,越高级的珍珠越贵.现在要买一些珍珠.每一种珍珠买的时候必须在已有的数量上加上10个购买(防止有些人只买几个).可以将采购的珍珠从低级换成高级(反之则不可).问最少花多少钱. 思路 这是一道DP问题.我们用dp[i]表示考虑前i种(最便宜的i种)珍珠所需要的最低价格.假设我们已经知道了dp[1] dp[2] -. dp[i] 则dp[i+1]可以如下表示 dp[i+1] = dp[i] + (c[i+1]+10)*p[i+1] dp[i+1] = min(dp[i+1]

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅

POJ题目分类

初期: 一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,he

嗷嗷嗷,kuangbin大大博客上拉的题

正在学(learning),未学(waiting),已学(cut  vovering) 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.