zoukankan      html  css  js  c++  java
  • hdu 饭卡

    编辑器加载中.

    饭卡

    Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 112 Accepted Submission(s): 50
    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
    分析:
    这是一个变形的01背包问题,首先如果金额小于5元,剩余金额不变,为已有金额。如果大于等于5元
    我们先用5元买最贵的菜。然后用剩下的钱买其他的菜这时就是一个典型的01背包问题了;
    求出最大的花费,然后用总金额减去最大的花费即为剩余金额。
    抽象的地方是花费和价值都是用金额表示。
     1 #include <iostream>
    2 #include <stdio.h>
    3 #include <algorithm>
    4 #include <string.h>
    5 using namespace std;
    6 bool cmp(int a,int b)
    7 {
    8 return a<b;
    9 }
    10 int main()
    11 {
    12 int n,k[1001],f[1001],m;
    13 while(scanf("%d",&n),n)
    14 {
    15 for(int i = 0; i < n; i++)
    16 {
    17 scanf("%d",&k[i]);
    18 }
    19 sort(k,k+n,cmp);
    20 scanf("%d",&m);
    21 if(m>=5)
    22 {
    23 memset(f,0,sizeof(f));
    24 for(int i = 0; i < n-1; i++)
    25 for(int j = m-5; j>=k[i];j--)
    26 {
    27 if(f[j-k[i]]+k[i]>f[j]&&f[j-k[i]]+k[i]<=m-5)//注意这里的f[j-k[i]]+k[i]<=m-5。
    28 f[j] = f[j-k[i]]+k[i];
    29 }
    30 printf("%d\n",m-f[m-5]-k[n-1]);
    31 }
    32 else printf("%d\n",m);
    33 }
    34 return 0;
    35 }

    关于27行f[j-k[i]]+k[i]<=m-5这个条件,我试过不要这个条件在hdu上一样可以通过。但是仔细考虑这个条件还是不可少的,

    因为针对这个题我们已经用五元购买最贵的菜了,也就是说剩下的金额不能再超支了。所以总花费不能大于m-5.

  • 相关阅读:
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 24 两两交换链表中的节点
    Java实现 LeetCode 24 两两交换链表中的节点
    Java实现 LeetCode 24 两两交换链表中的节点
  • 原文地址:https://www.cnblogs.com/newpanderking/p/2151616.html
Copyright © 2011-2022 走看看