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 }

 

你可能感兴趣的:(动态规划)