• 饭卡(hdoj--2546--背包)


    饭卡

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


    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




    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int f[1010],pice[1010];
    int main()
    {
    	int n,i,j,m;
    	while(scanf("%d",&n),n)
    	{
    		memset(f,0,sizeof(f));//记得数组清零 
    		memset(pice,0,sizeof(pice));
    		for(i=0;i<n;i++)
    		scanf("%d",&pice[i]);
    		sort(pice,pice+n);
    		int maxx=pice[n-1];
    		scanf("%d",&m);
    		if(m<5)
    		{
    			printf("%d
    ",m);continue;
    		}
    		else
    		{
    			int ret=m-5;//最后剩下的五块钱买下最贵的
    			for(i=0;i<n-1;i++)
    			{
    				for(j=ret;j>=pice[i];j--)
    				{
    					f[j]=max(f[j],f[j-pice[i]]+pice[i]);
    				}
    			}
    			printf("%d
    ",m-maxx-f[ret]);
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    函数输出参数 双重指针
    NotePad++ 支持日语字体
    C++ 前置操作符与后置操作符
    用js判断 iPhone6 iPhone6 plus iphonex?
    从浏览器输入一个地址到渲染出网页这个过程发生了什么???
    对.Net 垃圾回收Finalize 和Dispose的理解
    在.NET环境中使用单元测试工具NUnit
    信道
    asp.net 获取当前URL的正确方法
    ASP.NET中常用输出JS脚本的类
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273811.html
Copyright © 2020-2023  润新知