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 }
  • 相关阅读:
    若干排序算法简单汇总(二)
    合并两个链表的问题
    pl/sql(2)
    jQuery的DOM操作之加入元素和删除元素
    怎样优雅的研究 RGSS3 (四) 使窗体从画面边缘弹出
    Android经常使用UI组件
    在Hadoop监控页面怎样查看Hive的完整SQL
    HDU4911:Inversion
    AIX系统开启ftp服务
    JavaScript 模拟策略模式
  • 原文地址:https://www.cnblogs.com/Fantastic-Code/p/8366959.html
Copyright © 2011-2022 走看看