1.题目描述:
某邮局将信分为两类,第一类信件要求在收信后的第2个工作日投到,第二类信件要求在收信第3个工作日投到,两类邮件的邮资如表1所示。
表1 邮资表
重量不超过 |
第一类邮资 |
第二类邮资 |
60g |
25便士 |
19便士 |
100g
扫描二维码关注公众号,回复:
771186 查看本文章
|
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 }