• 邮资所需的最少邮票张数.(动态规划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 }
  • 相关阅读:
    C\C++\Java字符串拼接比较
    Visual Assist X支持VS2010高亮显示CUDA代码(Windows 7)
    相似字符串(编程之美2013初赛题2)
    linux mdadm raid阵列重建加速bitmaps文件
    Pig Grunt之简单命令及实例说明
    error: device not found解决
    Spring配置文件错误
    Java贪吃蛇游戏(坐标方法)
    java增强型for循环(三种遍历集合方式)
    酸菜鱼的简单做法
  • 原文地址:https://www.cnblogs.com/Fantastic-Code/p/8366959.html
Copyright © 2020-2023  润新知