HDU 2546 01背包问题

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int qq=1000+10;
int price[qq<<1],dp[qq<<1];
int main()
{
    int n;
    while(~scanf("%d",&n)&&n){
        memset(price,0,sizeof(price));    //初始化
        memset(dp,0,sizeof(price));
        for(int i=0;i<n;++i)
            scanf("%d",&price[i]);
        sort(price,price+n);
        int money;scanf("%d",&money);
        if(money<5){
            printf("%d\n",money);
            continue;
        }
        money=money-5;        //取出5元用于购买最贵的物品、
        for(int j,i=0;i<n-1;++i)
            for(j=money;j>=price[i];--j)
                dp[j]=max(dp[j],dp[j-price[i]]+price[i]);    //物品只有买或者不买两种选择
        printf("%d\n",money+5-dp[money]-price[n-1]);
    }
    return 0;
} 
时间: 2024-10-09 21:10:01

HDU 2546 01背包问题的相关文章

hdu 2546 01背包

背景:1--WA:卡上最低要求为5元才能消费的边界情况没有处理. 思路:首先判断卡上余额是否有五元,不是直接输出.然后,从卡里面拿出五元来买最大价值,剩下的钱尽可能用完就可以了. 学习:1.这里透露了一个基本问题:从n个数中选取m个数,使这m个数的和尽可能的接近k.这个体是把k看做背包的容量,把一个数的值既看做价值又看做体积,转化为01背包问题. 我的代码: #include<iostream> #include<cstdio> #include<cstring> us

HDU 2546(01背包)

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

HDU 2546 饭卡 01背包问题

01背包问题,增加一个额外条件,余额大于等于5的时候,可以购买任意价格的东西,那么就把5保留下来买最大价格的物品. 然后转化为收益的时候要注意初始条件,即没买东西的时候收益就是余额,就是所有的钱.这个还是有点难转换思维的. 最后是要熟悉背包填表,不需要保留选择的时候,就逆向填表,只需要一维表就可以了,当然也可以使用滚动数组,两个一维数组就可以了. 走了算法一圈回来了,AC自动机,线段树等都学会了,但是遇上这些基础DP还是不太轻松,看来需要继续打打基础.主要是思维转换不够流畅,速度就不快了. #i

动态规划专题 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背包)

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

HDU 2602 Bone Collector (01背包问题)

原题代号:HDU 2602 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 原题描述: Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone Collector". This man like to collect varies of bones , such as dog's , cow's ,

hdu 2546 饭卡

0-1背包问题 i = 1,扫所有上限价钱只购买一件物品的最大消费(price[1]) i = 2,更新一遍,此时是购买两件物品的最大消费(price[2]) 以此类推~有n件物品 但是只进行到n-1,是因为最大的那件物品留至最后才减 价值最高上限为m-5 1 #include<iostream> 2 #include<memory.h> 3 #include<algorithm> 4 using namespace std; 5 int price[1010]; 6

杭电 oj2602~(0-1背包问题)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 51417    Accepted Submission(s): 21634 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bon

hdu5188 加限制的01背包问题

http://acm.hdu.edu.cn/showproblem.php? pid=5188 Problem Description As one of the most powerful brushes in the world, zhx usually takes part in all kinds of contests. One day, zhx takes part in an contest. He found the contest very easy for him. Ther