题目:http://poj.org/problem?id=1260
题意:给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。
珍珠的替代必须是连续的,不能跳跃替代(这个不难证明,因为假如用第i+2类去替代第i类珍珠,会使最终的支付价格降低,那么用第i+1类去替代第i类珍珠会使最终的支付价格更加低)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int main() 8 { 9 int t,i,j,num,minn,sum; 10 int d[1100],n[1100],p[1100]; 11 cin>>t; 12 while(t--) 13 { 14 cin>>num; 15 for(i=1; i<=num; i++) 16 cin>>n[i]>>p[i]; 17 d[0]=0; 18 for(i=1; i<=num; i++) 19 { 20 minn=1000000000; sum=n[i]; 21 for(j=i-1; j>=0; j--) 22 { 23 minn=min(minn,d[j]+(sum+10)*p[i]);//状态转移方程,d[i]表示到i种的时候的最优值,在这个循环里是 24 //比较前面的最优加 后面(到i)所有种珍珠转换成第i种珍珠的值。 25 sum+=n[j]; 26 } 27 d[i]=minn; 28 } 29 cout<<d[num]<<endl; 30 } 31 return 0; 32 }