zoukankan      html  css  js  c++  java
  • HDU 2546 饭卡(01背包)

    思路:

    最贵的菜一定是最后一次购买使餐卡上剩下的钱最小。

    输入如果小于5的话直接输出~

    不然先从所有菜中找出最贵的菜,然后给餐卡至少留下5块钱买这个最贵的菜,剩下的用一个0-1背包去装满!

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define sc(x) scanf("%d",&(x))
     6 #define pf(x) printf("%d
    ", x)
     7 #define CL(x, y) memset(x, y, sizeof(x))
     8 #define max(a, b) (a > b ? a : b)
     9 using namespace std;
    10 const int MAX = 1005;
    11 int dp[MAX], money[MAX];
    12 int n, m;
    13 int main ()
    14 {
    15     int i, j;
    16     while(sc(n))
    17     {
    18         if(n == 0) break;
    19         CL(dp, 0);
    20         for (i = 0; i < n; i++)
    21             sc(money[i]);   //价格
    22         sc(m);  //卡上的余额
    23         sort(money, money+n);     //排序,求前n-1个钱价的最大钱数
    24         if (m < 5)
    25             pf(m);
    26         else
    27         {
    28             for (i = 0; i < n-1; i++)    //01背包问题
    29                 for (j = m-5; j >= money[i]; j--)
    30                     dp[j] = max(dp[j], dp[j-money[i]] + money[i]);
    31             pf(m - dp[m-5] - money[n-1]);   //money[n-1] 最后一个价格
    32         }
    33     }
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    天梯赛练习2 补题
    QFNU 天梯赛练习 1 补题
    2019 山东省赛 B 题
    CCPC2020 网络赛 总结
    一个比较好看的 Typora 主题
    〔OS〕磁盘调度算法
    〔OS〕页面置换算法
    〔OS〕多线程模拟实现生产者和消费者
    〔OS〕银行家算法
    LCS and LIS
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4303562.html
Copyright © 2011-2022 走看看