Consumer HDU - 3449
Posted liuwenhan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Consumer HDU - 3449相关的知识,希望对你有一定的参考价值。
FJ打算去购物,在此之前,他需要一些盒子来装他要买的各种各样的东西。每个盒子都用来携带一些特定的东西(也就是说,如果他要买这些东西,他必须事先买到盒子)。每种东西都有自己的价值。现在FJ的购物金额只有W美元,他想用这笔钱购物,使他所买的物品的总价值最高。
有多组测试数据
有多组测试数据
Input 每组数据的第一行两个整数,盒子的个数n (1 <= n <= 50),FJ所携带钱的总额 w (1 <= w <= 100000)
接下来的n行中。每行前两个整数为:第i个盒子的价格pi(1<=pi<=1000),这个盒子可携带的物品的数量 mi (1<=mi<=10)接下来有mi对数字,表示物品的价格cj (1<=cj<=100),价值vj(1<=vj<=1000000)Output对于每一组测试数据,输出FJ可以得到价值的最大值
Sample Input
3 800
300 2 30 50 25 80
600 1 50 130
400 3 40 70 30 40 35 60
Sample Output
210
code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e5 + 10; 4 int dp[maxn]; 5 int tmp[maxn]; 6 7 int main() 8 9 int n, v; 10 while (cin >> n >> v) 11 12 memset(dp, 0, sizeof(dp)); 13 for (int i = 1; i <= n; i++) 14 15 int p, num; cin >> p >> num; 16 17 memcpy(tmp, dp, sizeof(dp)); 18 for (int j = 1; j <= num; j++) 19 20 int w, val; 21 scanf("%d%d", &w, &val); 22 for (int k = v - p; k >= w; k--) 23 tmp[k] = max(tmp[k], tmp[k - w] + val); 24 25 for (int j = 0; j <= v - p; j++) 26 dp[j + p] = max(dp[j + p], tmp[j]); 27 28 cout << dp[v] << endl; 29 30
以上是关于Consumer HDU - 3449的主要内容,如果未能解决你的问题,请参考以下文章