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\n", ans); } return 0; }