hdu 1712 ACboy needs your help 裸的泛化物品

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712

裸的泛化物品

泛化物品的意思就是物品的价值是变化的 取决于你给它多少花费

学习自背包九讲第八讲

dp[i][j]表示前i件物品共分配j花费的情况下能得到的最大值

三层循环 

第一层是物品 第二层是枚举总花费 第三层是枚举最新的一层占总花费的数目

用滚动数组来实现

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <set>
#include <queue>
#include <vector>

using namespace std;

typedef long long ll;

const int maxn = 110;

int a[maxn][maxn];
int dp[2][maxn];

int main()
{
    //freopen("in.txt", "r", stdin);

    int n, m;
    while(scanf("%d%d", &n, &m) == 2 && n != 0)
    {
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                scanf("%d", &a[i][j]);

        int cur = 0;

        for(int i = 1; i <= m; i++)
        {
            dp[cur][i] = a[1][i];
        }

        for(int i = 2; i <= n; i++)
        {
            memset(dp[cur^1], 0, sizeof(dp[cur^1]));

            for(int j = 1; j <= m; j++)
            {
                for(int k = 0; k <= j; k++)
                {
                    dp[cur^1][j] = max(dp[cur^1][j], dp[cur][k] + a[i][j-k]);
                }
            }

            cur = cur ^ 1;
        }

        int ans = 0;
        for(int i = 1; i <= m; i++)
        {
            ans = max(ans, dp[cur][i]);
        }

        printf("%d
", ans);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/dishu/p/4296348.html