HDU2546 饭卡(01背包)

来源:互联网 发布:淘宝三哥手机店可靠吗 编辑:程序博客网 时间:2024/04/20 21:41

题意:中文题。

思路:01背包,求能购买的价值最后减去。由于大于等于5时才可购买,所以价钱大的最后买,也就是先更新大的,再更新小的。所以要从大到小排序。

#include <algorithm>#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <vector>#include <string>#include <queue>#include <stack>#include <cmath>#include <set>#include <map>using namespace std;typedef long long LL;#define mem(a, n) memset(a, n, sizeof(a))#define ALL(v) v.begin(), v.end()#define si(a) scanf("%d", &a)#define sii(a, b) scanf("%d%d", &a, &b)#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)#define pb push_back#define eps 1e-8const int inf = 0x3f3f3f3f, N = 1e3 + 5, MOD = 1e9 + 7;int T, cas = 0;int n, m;int a[N], dp[N];int main(){#ifdef LOCAL    freopen("/Users/apple/input.txt", "r", stdin);//freopen("/Users/apple/out.txt", "w", stdout);#endif    while(si(n), n) {    mem(dp, 0);    for(int i = 0; i < n; i ++) si(a[i]);    si(m);    sort(a, a + n);    for(int i = n - 1; i >= 0; i --) {    for(int j = m; j >= 5; j --) {    if(j - a[i] >= 0) dp[j] = max(dp[j], dp[j-a[i]] + a[i]);    else dp[j] = max(dp[j], a[i]);    }    }    printf("%d\n", m - dp[m]);    }        return 0;}


0 0
原创粉丝点击