【HDU】I love sneakers!(分组背包)

看了许多的题解,都有题目翻译,很不错,以后我也这样写。直接翻译样例:

1 1 4 6   /*鞋子的数量N[1, 100]; 拥有的金钱M[1, 1w]; 品牌数目[1, 10]*/
2 2 5 7   /*以下四行是对于每双鞋的描述*/
3 3 4 99  /*品牌种类a; 标价b; 高兴程度增加量c*/
4 1 55 77
5 2 44 66
6
7 /*每一种品牌的鞋子最少买一双,求最大的高兴程度*/

很容易看出是分组背包的题型,trick是价格可能为0(居然有免费的),所以注意dp转移数组初始化-inf。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <cctype>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <numeric>
 9 #include <set>
10 using namespace std;
11
12 //const int = INT_MIN;
13 int s[15][105], v[15][105], dp[15][10005];
14
15
16 int main () {
17     ios :: sync_with_stdio(false);
18     int N, M, K, a, b, c;
19     while (cin >> N >> M >> K) {
20         int cur[15] = {0};
21         for (int i = 1; i <= N; ++ i) {
22             cin >> a >> b >> c;
23             s[a][++ cur[a]] = b;
24             v[a][cur[a]] = c;
25         }
26         /*测试种类*/
27 /*
28         for (int i = 1; i <= N; ++ i) {
29              cout << i << " : " << cur[i] << endl;
30         }
31 */      /*dp数组初始化*/
32         for (int i = 1; i <= K; ++ i) {
33             for (int j = 0; j <= M; ++ j) {
34                 dp[i][j] = INT_MIN;
35             }
36         }
37
38         for (int i = 1; i <= K; ++ i) {
39             for (int j = 1; j <= cur[i]; ++ j) {
40                 for (int k = M; k >= s[i][j]; -- k) {
41                     dp[i][k] = max (dp[i][k], max (dp[i][k - s[i][j]] + v[i][j], dp[i - 1][k - s[i][j]] + v[i][j]) );
42                 }
43             }
44         }
45
46         //cout << dp[K][M] << endl;
47         if (dp[K][M] < 0) {
48             cout << "Impossible" << endl;
49         } else {
50             cout << dp[K][M] << endl;
51         }
52     }
53     return 0;
54 }
时间: 2024-10-28 20:44:32

【HDU】I love sneakers!(分组背包)的相关文章

HDU 3033 I love sneakers! 分组背包

我是个逗比...真心不是搞算法的料 不太中规中矩的分组背包,分组至少选一件商品.dp[i][j] 可以由当前dp[i-1][j-c] 和 dp[ i ][j-c]更新得到. #include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <cmath

hdu 3033 I love sneakers!(分组背包,每组至少取一件)

http://acm.hdu.edu.cn/showproblem.php?pid=3033 大致题意:某人要买鞋子,有k种鞋,要求每种鞋至少买一双,给出每双鞋子的花费和价值,问m元钱可以买到的鞋子的最大价值是多少. 思路:分组背包问题.与传统的分组背包不同:每组物品至少取一件:且每组中物品任意取. 想一想传统的分组背包,每组至多选一件: for 所有的组k     for v=V..0         for 所有的i属于组k             f[v]=max{f[v],f[v-c[i

hdu3033 I love sneakers!分组背包

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033 Problem Description After months of hard working, Iserlohn finally wins awesome amount of scholarship. As a great zealot of sneakers, he decides to spend all

HDU 4341 Gold miner(分组背包)

http://acm.hdu.edu.cn/showproblem.php?pid=4341 题意: 一个人在原点(0,0)抓金子,每块金子是二维坐标平面的一个点(x,y)且y>0. 每块金子有一个价值v和获得需要的时间t.如果多个金子在一条从原点射出的直线上,那只能先抓近的,再抓远的.求在给定时间T下,所能获得的最大价值. 分析: 首先想想如果所有点都不共线是什么情况? 就是在给定时间T内要获取最大的价值和的点, 且所有点都可以任意选取. 那么这就是一个01背包问题. 不过如果存在共线的点,那

hdu 1561 树形dp+分组背包

题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m)时选最多的宝物,而一个子节点中只可以选择一个状态进行转移,每个节点有若干个子节点,问题就转换为分组背包,几个子节点就是几个分组背包,体积是选几个地点,价值是宝物价值. 状态转移方程: dp[v][1] = Money[v]; (v为叶子节点)                    dp[v][j] = m

hdu3033 I love sneakers! 分组背包变形(详解)

这个题很怪,一开始没仔细读题,写了个简单的分组背包交上去,果不其然WA. 题目分析: 分组背包问题是这样描述的:有K组物品,每组 i 个,费用分别为Ci ,价值为Vi,每组物品是互斥的,只能取一个或者不取(最多取一个),求在一定背包容量V的情况下,能够获得的最大价值. 而这个题是,他每个牌子的鞋最少会买一双,但不会买一个牌子同款的两次. 也就是说如果将每个牌子分成一组,那么在每组里面要至少取一双,所以这更像是在每组里面进行01背包. 普通的分组背包的三层循环是: for(int k=0; k<K

hdu 3033(好题,分组背包)

I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4919    Accepted Submission(s): 2022 Problem Description After months of hard working, Iserlohn finally wins awesome amount of sc

HDU 4341 Gold miner 分组背包变形

题意: 挖金矿,人在(0,0)点 n个金子 游戏时间为T 下面n行 (x, y) cost val 且若人 和 多块金子共线时,只能先取最近的金子,依次取,就是和游戏一样的. 且所有点只在1 2象限 思路: 我们先把所有共线的点分组 对于每组的物品,我们都可以认为取这个物品的花费就是前面所有物品的花费总和,而价值就是前面所有物品的价值总和. 这样就能消除每组物品的先取后取的影响了,但有一个情况就是这组至多只能取一个物品,所以每个状态只能是取了这个物品后或者是原始状态. 用原始状态转移,然后和原始

hdu 4003 树形dp+分组背包

题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 Sample Output 3 2 转移方程: dp[i][j]=min(dp[i][j],dp[i][j*k],dp[son[i]][k]+len(i,son[i])*k) 方程还是比较好写的,主要是要遍历所有的点 下面我们分析一下第一个样例 1 / \ / \ 2 3 我们派了一个机器人去3,

hdu 4003 树形dp+分组背包 2011大连赛区网络赛C

题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 Sample Output 3 2 转移方程: dp[i][j]=min(dp[i][j],dp[i][j*k],dp[son[i]][k]+len(i,son[i])*k) 方程还是比较好写的,主要是要遍历所有的点 下面我们分析一下第一个样例 1 / \ / \ 2 3 我们派了一个机器人去3,