UESTC 31 饭卡 card

dp,答案容易想到是 凑出价格总和≤m-5 + 没被使用的最大价格。

dp[i = 前i种价格][j = 价格总和] = 最大没使用的价格下标idx_m。

dp[i-1][j]存在的话,则只要更新idx_m。

如果dp[i-1][j-c[i]]存在但是dp[i-1][j]不存在,那么c[i]必须使用,idx不变。

把价格从小到大排序更容易写。

/**
alfs x kayi
*/
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxn = 1e3+1;
int c[maxn];
int dp[maxn];
int n, m;

int solve()
{
    if(m < 5) {
        return m;
    }
    int lm = m-5, i;
    memset(dp+1,-1,sizeof(int)*lm);
    sort(c+1,c+n+1);
    dp[0] = 0; c[0] = 0;
    for(i = 1; i <= n; i++){
        for(int j = lm; j>=c[i]; j--){
            if(~dp[j-c[i]]){
                dp[j] = ~dp[j]? i : dp[j-c[i]];
            }
        }
        for(int j = c[i]-1; j >= 0; j--){
            if(~dp[j]) dp[j] = i;
        }
    }
    int ans = m ;
    for(i = 0; i <= lm; i++){
        if(~dp[i]){
            ans = min(ans, m-i-c[dp[i]]);
        }
    }
    return ans;
}

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    while(scanf("%d",&n),n){
        for(int i = 1; i <= n; i++){
            scanf("%d", c+i);
        }
        scanf("%d", &m);
        printf("%d\n", solve());
    }
    return 0;
}
时间: 2024-12-15 01:51:52

UESTC 31 饭卡 card的相关文章

UESTC 31 饭卡(Card) --背包问题

背包问题. 思路:如果m<5,此时也不能消费,所以此时答案为m m>=5: 求出背包容量为m-5,买前n-1样便宜的菜(排个序)的最大价值(即最大消费,即消费完后剩余值最接近5)最后减去最大的那个菜的价格,就得到最小的余额. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using n

cdoj 31 饭卡(card) 01背包

饭卡(card) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/31 Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家都希望尽量使卡上的余额最少. 某天,食堂中有n种菜出售,每种菜可购买一次.已知每种

CDOJ 31 饭卡(card) 解题报告

题目链接:http://acm.uestc.edu.cn/#/problem/show/31 01背包一眼题,没什么好解释…… 背包容量是m-5,留下一个最贵不要在01背包里算,最后买. 没错我需要<algorithm> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int n, m, p[1005]; int opt[1005]; int nex

cdoj31-饭卡(card) (01背包)

http://acm.uestc.edu.cn/#/problem/show/31 饭卡(card) Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家都

HDUOJ 2546 饭卡

饭卡 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 254664-bit integer IO format: %I64d      Java class name: Main 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够

HDU 2546 饭卡(01背包裸题)

饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28562    Accepted Submission(s): 9876 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无

动态规划专题 01背包问题详解 HDU 2546 饭卡

我以此题为例,详细分析01背包问题,希望该题能够为初学者对01背包问题的理解有所帮助,有什么问题可以向我提供,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14246    Accepted Submission(s): 4952 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即

HDU 2546 饭卡(0-1背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2546 题意: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家都希望尽量使卡上的余额最少. 某天,食堂中有n种菜出售,每种菜可购买一次.已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少. 思路:我们先用一个背包容量为price-5的背包去装菜,背包里

hdu 2546 饭卡(01背包)

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