邮资所需的最少邮票张数.(动态规划VS贪心)

 1.题目描述:

  某邮局将信分为两类,第一类信件要求在收信后的第2个工作日投到,第二类信件要求在收信第3个工作日投到,两类邮件的邮资如表1所示。

                                      表1   邮资表

                          

重量不超过

第一类邮资

第二类邮资

60g

25便士

19便士

100g

38便士

29便士

150g

47便士

36便士

250g

57便士

43便士

300g

77便士

52便士

350g

88便士

61便士

400g

1.00镑

70便士

450g

1.13镑

79便士

500g

1.25镑

89便士

600g

1.55镑

98便士

700g

1.90镑

1.20镑

750g

2.05镑

1.40镑

800g

2.15镑

不允许超过750g

900g

2.35镑

 

1000g

2.40镑

 

 

每超过250g或超过

一部分再加65便士

 

    英国当前使用的是以下面值的邮票:1便士,2便士,3便士,4便士,5便士,6便士,10便士,19便士,20便士,25便士,30便士,35便士,

    36便士,38便士,41便士,50便士,1.00镑,1.50镑,2.00镑,5.00镑,10.00镑。

    给出表1中每一种邮资所需的最少邮票张数。

    代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int a[15]= {25,38,47,57,77,88,100,113,125,155,
 4             190,205,215,235,240
 5            };
 6 int d[12]= {19,29,36,43,52,61,70,79,89,98,120,140};
 7 int b[21]= {1,2,3,4,5,6,10,19,20,25,30,35,36,38,41,50,100,150,200,500,1000};
 8 int dp[21][242];
 9 #define MAX 10000
10 int main()
11 {
12     int i,j,k,m,n;
13     for(j=1;j<=240;j++)
14     {
15         dp[0][j]=MAX;
16         if(j-b[0]>=0&&dp[0][j-b[0]]!=MAX)
17             dp[0][j]=dp[0][j-b[0]]+1;
18     }
19     for(i=1;i<21;i++)
20     {
21         for(j=1;j<=240;j++)
22         {
23             int s=MAX;
24             if(j-b[i]>=0&&dp[i][j-b[i]]!=MAX)
25                 s=dp[i][j-b[i]]+1;
26             dp[i][j]=min(s,dp[i-1][j]);
27         }
28     }
29     for(i=0;i<15;i++)
30     {
31         cout<<dp[20][a[i]]<<' ';
32     }
33     cout<<endl;
34     for(i=0;i<12;i++)
35     {
36         cout<<dp[20][d[i]]<<' ';
37     }
38     return 0;
39 }

贪心思路:

 1 #include<iostream>
 2 using namespace std;
 3 int a[15]= {25,38,47,57,77,88,100,113,125,155,
 4             190,205,215,235,240
 5            };
 6 int d[12]= {19,29,36,43,52,61,70,79,89,98,120,140};
 7 int b[21]= {1,2,3,4,5,6,10,19,20,25,30,35,36,38,41,50,100,150,200,500,1000};
 8 int c[15];
 9 int e[12];
10 
11 int main()
12 {
13     int i,j,k,m,n;
14     for(i=0; i<15; i++)
15     {
16         m=0;
17         for(j=20; j>=0; j--)
18         {
19             k=a[i]/b[j];
20             a[i]-=k*b[j];
21             m+=k;
22         }
23         c[i]=m;
24         cout<<c[i]<<' ';
25     }
26     cout<<endl;
27     for(i=0; i<12; i++)
28     {
29         m=0;
30         for(j=20; j>=0; j--)
31         {
32             k=d[i]/b[j];
33             d[i]-=k*b[j];
34             m+=k;
35         }
36         e[i]=m;
37         cout<<e[i]<<' ';
38     }
39     return 0;
40 }

 

posted @ 2018-05-14 00:47  FantasticSpeed  阅读(599)  评论(0编辑  收藏  举报