zoukankan      html  css  js  c++  java
  • 邮资所需的最少邮票张数.(动态规划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 }
  • 相关阅读:
    堆和栈的差别(转过无数次的文章)
    【java】Windows7 下设置环境变量
    很好的理解遗传算法的样例
    Flex里的特效
    Spring3.0 AOP 具体解释
    send,recv,sendto,recvfrom
    协方差矩阵, 相关系数矩阵
    解决Shockwave flash在chrome浏览器上崩溃的问题
    杂记之activity之间的跳转
    DropdownList绑定的两种方法
  • 原文地址:https://www.cnblogs.com/Fantastic-Code/p/8366959.html
Copyright © 2011-2022 走看看