HLG 1333 GG的关心 01背包

GG的关心
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 123(36 users) Total Accepted: 37(25 users) Rating:  Special Judge: No
Description

电脑买回来后,MM一直用它专心的搞ACM,看着MM专注的样子,GG也是非常开心,但害怕MM劳累过度影响身体,于是GG经常到超市给MM买一些营养品来补充身体能量。GG到超市购物从来都是刷卡的,可是这种卡很诡异,当用它在超市购物的时候,刷卡机会先判断卡上的余额是否低于5元钱。如果低于5元钱则无法购买任何物品,即使那件物品的金额是小于5的也不可以。而如果卡上的金额大于等于5元则可以进行交易,即使交易成功后卡中余额为负数也是可以的。

现在超市有n种物品,每种物品最多只能买一个。已知每种物品的价格和卡上的余额。问最少可使卡上的余额为多少。

Input

输入包含多组数据。对于每一组数据:

第一行有两个正整数nm,分别代表物品的种类数,以及卡中的余额。

第二行包含n个正整数p1,p2,p3…pn,分别代表每一种物品的价格。

n0时表示输入结束

范围:

m, n <= 1000

pi <= 50 (1 <= i <= n)

Output

对于每组输入,输出一个整数并换行,代表卡上可能的最小余额。

Sample Input
1 5
50
10 50
1 2 3 2 1 1 2 3 2 1
0
Sample Output
-45
32
Hint
买东西是一件一件买。
Source

2012 Spring Contest 5 - Binary Search, Greedy, DP

普通的01背包 每次先拿五块出来把最大价值的买了就好 ////一个变量没初始化 debug了半天  蒟蒻蒟蒻

ACcode:

#pragma warning(disable:4786)//使命名长度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 1000005
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI  acos(-1.0)
#define E  exp(1)
using namespace std;
int a[maxn],dp[maxn],n,money,maxx;
int main(){
    while(rd(n)&&n){
        rd(money);
        FOR(i,1,n)rd(a[i]);
        if(money<5){
            printf("%d\n",money);
            continue;
        }
        maxx=0;///忘记初始化
        sort(a+1,a+1+n);
        maxx=a[n];n--;
        money-=5;
        maxx=5-maxx;
        MT(dp,0);
        FOR(i,1,n)
            for(int j=money;j>=a[i];j--)
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
        printf("%d\n",money-dp[money]+maxx);
    }
    return 0;
}
/*
3
11
4 3 4
3
11
4 3 45
1 5
50
10 50
1 2 3 2 1 1 2 3 2 1
0
*/


你可能感兴趣的:(C++,dp)