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

    饭卡

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

    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的背包里的最大菜的价值再减去最贵的菜的钱数

    #include <bits/stdc++.h>
    #define ll long long
    #define ms(a) memset(a,0,sizeof(a))
    using namespace std;
    const int maxn=1e3+10;
    int a[maxn];
    int dp[maxn];
    int main(int argc, char const *argv[])
    {
    	int n,money;
    	while(~scanf("%d",&n)&&n)
    	{
    		ms(a);
    		ms(dp);
    		int res=0;
    		for(int i=0;i<n;i++)
    		{
    			scanf("%d",&a[i]);
    			res+=a[i];
    		}
    		sort(a,a+n);
    		scanf("%d",&money);
    		if(money<5)
    		{
    			printf("%d
    ",money);
    			continue;
    		}
    		if(res<money)
    		{
    			printf("%d
    ",money-res);
    			continue;
    		}
    		for(int i=0;i<n;i++)
    		{
    			for(int j=money-5;j>=a[i];j--)
    			{
    				dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
    			}
    		}
    		printf("%d
    ",money-dp[money-5]-a[n-1]);
    	}
    	return 0;
    }
  • 相关阅读:
    mysql的查询、子查询及连接查询
    面向对象知识点续及单例模式
    PSR-2 编码风格规范
    PSR-1 基础编码规范
    博客园文章添加版权信息的方法
    微博第三方登陆接入流程
    使用EasyWechat快速开发微信公众号支付
    Git版本管理工具的使用
    E: Could not get lock /var/lib/apt/lists/lock
    ubuntu安装opencv
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324409.html
Copyright © 2011-2022 走看看