HDU2546(01背包饭卡)

电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于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

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1005],a[1005];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        if(n==0)
            break;
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        int m;
        scanf("%d",&m);
        if(m<5)
            printf("%d\n",m);
        else
        {
            m=m-5;
            for(int i=1; i<=n-1; i++)
                for(int j=m; j>=a[i]; j--)
                    dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            printf("%d\n",m+5-a[n]-dp[m]);
        }

    }
    return 0;

}
时间: 2024-11-10 14:30:45

HDU2546(01背包饭卡)的相关文章

饭卡-HDU2546(01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17947    Accepted Submission(s): 6258 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个

hdu2546 01背包

http://acm.split.hdu.edu.cn/showproblem.php?pid=2546 01背包问题,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了. 状态转移方程为:f[j]=max(f[j],f[j-price[i]]+price[i]) , f[j]表示买前i件物品,预算为j时的最大花销 为了好弄,我把最贵的移到数组尾部. Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购

POJ1976A Mini Locomotive(01背包装+连续线段长度)

A Mini Locomotive Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2485   Accepted: 1388 Description A train has a locomotive that pulls the train with its many passenger coaches. If the locomotive breaks down, there is no way to pull the

HDU2546——背包DP——饭卡

Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家都希望尽量使卡上的余额最少. 某天,食堂中有n种菜出售,每种菜可购买一次.已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少. Input 多组数据.对于每组数据: 第一行为正整数n,表示菜的数量.n<=1000. 第二行包括n个正整数,表示每种菜的价格.价格不超过5

0-1背包修改版

题目描述 零崎有很多朋友,其中有一个叫做lfj的接盘侠. lfj是一个手残,他和零崎一起玩网游的时候不好好打本,天天看拍卖行,没过多久,就成为了一个出色的商人.不过再出色的投机商也有失手成为接盘侠的一天.所谓真正的接盘侠从来不给自己留活路.当lfj接盘成功之时,即分文不剩之日. 作为lfj的友人,零崎实在看不下去,于是他决定帮lfj一把.当然了,零崎肯定不会自己动手,活还得你们来干. lfj可以提供给你们拍卖行所有能买到物品的价格和利润,还有他的本金.既然是接盘侠,就必须分文不剩.虽然零崎想让你

基于卡方分箱的评分卡建模

卡方分布-chi-square distribution, χ2-distribution: 若k个独立的随机变量Z1, Z2,..., Zk 满足标准正态分布 N(0,1) , 则这k个随机变量的平方和: 为服从自由度为k的卡方分布,记作:  或者  卡方检验-χ2检验是以χ2分布为基础的一种假设检验方法,主要用于分类变量之间的独立性检验: 基本思想是根据样本数据推断总体分布与期望分布是否有显著性差异,或者推断两个分类变量是否相关或者独立.一般可以设原假设为 :观察频数与期望频数没有差异,或者

01背包思想和优化

dp入门问题:01背包装下了我们的忧伤QWQ 作为一枚乐于作死...呸,乐于学习的蒟蒻,当然要学会装包的 那么简单的描述一下01背包问题: 小明有个bag,容量是m.小明面前有n个物品,每个物品有它的价值vi和它的体积wi,小明想知道用这个背包能装到的物品总价值最大是多少. 好,这就是一个最朴素的01背包问题,那么怎么解决呢. 稍加思索...dp嘛,从小问题解决到大问题.我们用一个数组dp[i][j]表示选第i件物品时容量为j可以得到的最大价值. 状态转移方程就出来啦:dp[i][j]=max(

百度回家看沙发沙发是减肥了卡斯加积分卡拉是减肥

http://www.ebay.com/cln/hpryu-caw8ke/cars/158056866019/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445650015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445674015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/1584456790

oi再见,你好明天。

oi再见,你好明天.录Menci大佬的翻唱<模你抄>如下:屏幕在深夜微微发亮思想在那虚树路径上彷徨平面的向量交错生长织成 忧伤的网 剪枝剪去我们的疯狂SPFA告诉我前途在何方01背包装下了忧伤笑颜 洋溢脸庞 键盘微凉 鼠标微凉指尖流淌 代码千行凸包周长 直径多长一进考场 全都忘光你在OJ上提交了千百遍却依然不能卡进那时限双手敲尽代码也敲尽岁月只有我一人 写的题解凋零在OJ里面 tarjan陪伴强联通分量生成树完成后思路才闪光欧拉跑过的七桥古塘让你 心驰神往 队列进出图上的方向线段树区间修改求出