HDOJ 3449 Consumer(简单的依赖背包)
题意:
有很多个箱子,想买箱子中的物品必须先买下箱子
思路:
依赖背包,实际的操作过程中依然需要注意几个点:01背包的时候,背包容量是由max-p到ci,而非max到p+ci。
至于为什么,因为后一种则就是表示每个物品代价是p+ci,而非ci了,所以此时就会计算错误
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;
#define max(a,b) (((a) > (b)) ? (a) : (b))
const int MAXN = 100010;
int dp[MAXN], ansdp[MAXN];
int main()
{
int n, w;
while (scanf("%d %d", &n, &w) != EOF)
{
int p, m;
memset(ansdp, 0, sizeof(ansdp));
for (int i = 0; i < n; ++i)
{
scanf("%d %d", &p, &m);
int c, v;
// memset(dp, 0, sizeof(dp));
memcpy(dp, ansdp, sizeof(dp));
// dp[p] = 0;
for (int j = 0; j < m; ++j)
{
scanf("%d %d", &c, &v);
for (int k = w - p; k >= c; --k)
dp[k] = max(dp[k], dp[k-c] + v);
}
for (int j = w; j >= p; --j)
// for (int k = p; k <= j; ++k)
ansdp[j] = max(ansdp[j], dp[j-p]);
}
printf("%d\n", ansdp[w]);
}
return 0;
}
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------