• 动态规划:HDU-2542-0-1背包问题:饭卡


    解题心得:

    1. 这题就是一个简单的0-1背包问题,只不过加了一系列的限制。可以想办法消去限制,直接转换成0-1背包问题的模板形式。
    2. 需要注意的几个点:首先对于剩余的5元钱的处理可以直接在总的钱数上将5减去,然后处理大于零的(将特殊化为一般),需要排一个序,方便操作。第二点,最后得出的答案应该是大于5的(之前减了5),所以最后的答案减去一个最大的数就是最小的结果。
    3. 主要运用的是一个贪心的思想,将最贵的那个菜去掉和总金额减去5然后再动态规划,规划完毕之后在加上5减去最贵的那个菜就是余额显示最小的结果。

    题目:

                        饭卡
    

    Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 27930 Accepted Submission(s): 9688

    Problem Description
    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
    某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。

    Input
    多组数据。对于每组数据:
    第一行为正整数n,表示菜的数量。n<=1000。
    第二行包括n个正整数,表示每种菜的价格。价格不超过50。
    第三行包括一个正整数m,表示卡上的余额。m<=1000。

    n=0表示数据结束。

    Output
    对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。

    Sample Input
    1
    50
    5
    10
    1 2 3 2 1 1 2 3 2 1
    50
    0

    Sample Output
    -45
    32

    Source
    UESTC 6th Programming Contest Online


    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1010;
    int dp[maxn];
    int num[maxn];
    int main()
    {
        int n;
        while(scanf("%d",&n) && n)
        {
            int money,Max = 0;
            for(int i=0; i<n; i++)
                scanf("%d",&num[i]);
            scanf("%d",&money);
            sort(num,num+n);//排序方便后面的额操作
            if(money < 5)//钱少于5什么也买不了
            {
                printf("%d
    ",money);
                continue;
            }
            money -= 5;//减去5再算
            for(int i=0; i<=money; i++)
                dp[i] = money;
            for(int i=0; i<n-1; i++)//不算最贵的那个菜,按照贪心的思想,最后的钱的数目减去最贵的菜的价格就是最小余额
                for(int j=money; j>=num[i]; j--)
                    if(dp[j-num[i]]-num[i] >= 0)
                        dp[j] = min(dp[j],dp[j- num[i]] - num[i]);
            printf("%d
    ",dp[money]+5-num[n-1]);
        }
    }
  • 相关阅读:
    java ee / video / rtsp / rtmp / fuck douyin / fuck douyincdn / fuck amemv.com
    6步 实现 mysql8.0 MGR架构
    使用redis zset 数据结构进行分数排名
    First Look at Some of the GTK4 Apps in GNOME 42
    Introducing LibadwaitaGTK 3 (and libhandy) to GTK 4 and libadwaita for GNOME 41 GNOME 42
    Send same packets to multiple clients
    LeetCode 207. Course Schedule
    LeetCode 210. Course Schedule II
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 797. All Paths From Source to Target
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107377.html
Copyright © 2020-2023  润新知