码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 01背包(1171+2546+。。

时间:2015-05-15 19:40:16      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

1171

题意比较简单,这道题比较特别的地方是01背包中,每个物体有一个价值有一个重量,比较价值最大,重量受限,这道题是价值受限情况下最大,也就值把01背包中的重量也改成价值。

//Problem : 1171 ( Big Event in HDU )     Judge Status : Accepted

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

int v[6000], dp[5000 * 50 + 10];


int main() {
    //freopen("in.txt", "r", stdin);
    int n;
    int sum;
    while (scanf("%d", &n) != EOF && n >= 0) {
        memset(dp, 0, sizeof(dp));
        int a, b;
        sum = 0;
        int idx = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%d%d", &a, &b);
            sum += a * b;
            for (int j = 0; j < b; j++) {
                v[++idx] = a;
            }
        }
        for (int i = 1; i <= idx; i++)
            for (int j = sum / 2; j >= v[i]; j--)
                dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
        printf("%d %d\n", sum - dp[sum / 2], dp[sum / 2]);
    }
    return 0;
}

2546

和上面一样,没有重量,只有价值。

如果卡上不足5元,输出原值。如果大于5元,就在m-5范围内花最多的钱(留下最贵的菜),然后用剩下的钱减去最贵的菜。

代码

//Problem : 2546 ( 饭卡 )     Judge Status : Accepted
#include <iostream>
#include <algorithm>
using namespace std;

int v[1005];
int dp[1005];

int main()
{
    int n, m;
    while (cin >> n && n) {
        memset(dp, 0, sizeof(dp)); //又忘记初始化然后wa了一发。。。
        for (int i = 1; i <= n; ++i) {
            cin >> v[i];
        }
        cin >> m;
        if (m < 5) {
            printf("%d\n", m);
            continue;
        }
        sort(v + 1, v + n + 1);
        for (int i = 1; i < n; ++i) {
            for (int j = m - 5; j >= v[i]; j--)
                dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
        }
        printf("%d\n", m - dp[m - 5] - v[n]);
    }

    return 0;
}

  

hdu 01背包(1171+2546+。。

标签:

原文地址:http://www.cnblogs.com/wenruo/p/4506652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!