邮资所需的最少邮票张数.(动态规划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 }

 

转载于:https://www.cnblogs.com/Fantastic-Code/p/8366959.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值