ZOJ1563 (动态规划)

解题思路:题意让求买下所有种类的珍珠的最小花费,注意题中明确说明为了防止旅游者仅买一颗珍珠,必须额外的买10颗该种类的珍珠。为了减小开销,可以买比该种类质量高的珍珠代替,从题中的例子可以看出。求解本题要用到动态规划,用dp[i] 表示买前 i 类珍珠所需要的最小花费,则递推关系式为:dp[i]=min( p[i]*( a[i]-a[j]+10 ) + dp[j], k ),其中a[i] 表示前 i 种类珍珠的总个数,而 k 初始化为无穷大。

代码如下:

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int i,j,a[105],p[105],dp[105],n,m,t;
 8     cin>>t;
 9     while(t--)
10     {
11         cin>>n;
12         memset(a,0,sizeof(a));
13         memset(dp,0,sizeof(dp));
14         for(i=1;i<=n;i++)
15         {
16             cin>>m>>p[i];
17             a[i]=a[i-1]+m;
18         }
19         for(i=1;i<=n;i++)
20         {
21             int min=0xfffffff,cost;
22             for(j=0;j<i;j++)
23             {
24                 cost=p[i]*(a[i]-a[j]+10)+dp[j];
25                 min=(min>cost)?cost:min;
26             }
27             dp[i]=min;
28         }
29         cout<<dp[n]<<endl;
30     }
31     return 0;
32 }

 

posted @ 2011-10-15 19:40  笑巧  阅读(447)  评论(0编辑  收藏  举报