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