zoukankan      html  css  js  c++  java
  • 饭卡

    饭卡
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    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

    我们显然的知道:用5元钱买最贵的菜,其他的钱买尽量多的菜,可以使得我们卡上的余额最少。

    所以m-5后进行01背包。

    但是有一个问题,如果m<5,我们就什么都不能买。开始没有写这个,所以一直wa

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int main()
    {
        int n;
        while(~scanf("%d",&n)&&n!=0)
        {
            int dp[1005];
            memset(dp,0,sizeof(dp));
    
            int val[1005];
            memset(val,0,sizeof(val));
            int sum=0;
            for(int i=0;i<n;i++)
            {
                scanf("%d",val+i);
                sum+=val[i];
            }
            sort(val,val+n);
            int m;
            scanf("%d",&m);
            if(m<5) {cout<<m<<endl;continue;}
            m-=5;
            for(int i=0;i<n-1;i++)
            {
                for(int j=m;j>=val[i];j--)
                {
                    dp[j]=max(dp[j-val[i]]+val[i],dp[j]);
                }
            }
    
            cout<<m-dp[m]+5-val[n-1]<<endl;
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/6067015.html
Copyright © 2011-2022 走看看