[HDU 3033] I love sneakers! (动态规划分组背包)

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

题意:给你K种品牌,每种品牌有不同种鞋,现在每种品牌至少挑一款鞋,问获得的最大价值,如果不能每种品牌都挑到则输出Impossible

自己太弱了!!!!!这个题都想不出来!!!!!还要看题解!!!!!!

设计状态dp[i][j]代表从前i种品牌里花了不超过j元钱。

那么状态转移可以这样:

1.我只买第i种品牌的第k个。

2.我在第i种品牌里不光买第k个。

变成状态转移方程就是:

1. dp[i][j] = dp[i-1][j-p[i][k]]+v[i][k];

2. dp[i][j] = dp[i][j-p[i][k]]+v[i][k];

对于每组,是一个01背包问题。

两个取最大。

本人太弱了。。这种题还看题解- -

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <map>
 6 #include <iterator>
 7 #include <vector>
 8 using namespace std;
 9 typedef long long LL;
10
11 int N,M,K;
12 int p[11][111],v[11][111];
13 int dp[11][11111];
14 const int INF = 99999999;
15
16 int main(){
17     while(scanf("%d%d%d",&N,&M,&K)!=EOF){
18         memset(p,0,sizeof(p));
19         memset(v,0,sizeof(v));
20         for(int i=1;i<=N;i++){
21             int x,y,z;
22             scanf("%d%d%d",&x,&y,&z);
23             p[x][++p[x][0]] = y;
24             v[x][++v[x][0]] = z;
25         }
26         for(int i=1;i<11;i++){
27             for(int j=0;j<11111;j++){
28                 dp[i][j] = -INF;
29             }
30         }
31 //        dp[0][0] = 0;
32         for(int i=1;i<=K;i++){
33             for(int k=1;k<=p[i][0];k++){
34                 for(int j=M;j>=p[i][k];j--){
35                         dp[i][j] = max(dp[i][j],max(dp[i-1][j-p[i][k]]+v[i][k],dp[i][j-p[i][k]]+v[i][k]));
36                 }
37             }
38         }
39         if(dp[K][M]<0) puts("Impossible");
40         else printf("%d\n",dp[K][M]);
41     }
42     return 0;
43 }
时间: 2024-10-08 17:25:32

[HDU 3033] I love sneakers! (动态规划分组背包)的相关文章

HDU 3033 I love sneakers! (01背包+反分组背包)

题意:给你 n,m,k,表示有k种鞋子共n双,你有m的容量: 每双鞋子有容量p和价值v:问是否买全k种鞋子,若能在容量为m的情况下最多能买到鞋子的价值为多少: 每双鞋子只能买一次(01背包),每种鞋子至少买一种(分组背包:每组只能有一个)与传统分组背包的限制相反. 注意初始化!!! #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map&g

【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转移数组初始化-

HDOJ 题目3033 I love sneakers!(分组背包)

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

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

HDU 3033 I love sneakers! (DP 01背包+完全背包)

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 his money on them in a sneaker store. There are several brands of sneakers that Iserlohn wan

hdu 3033 I love sneakers!

题目: 链接:点击打开链接 题意: xx喜欢收集鞋子,n,m,k分别表示鞋子的总数,xx的钱和鞋子的品牌数目.然后给出每个鞋子的信息有:a,是那种品牌,b,鞋子的标价,c,收藏鞋子得到的价值.对于一个收藏家来说,每种品牌的鞋子只收集一种,求出xx能够得到的最大的收藏价值. 算法: 分组背包问题. 思路: m总的钱数是背包容量,k品牌数是组数.用数组结构体保存每种鞋子的信息,d[i][j].w表示第i种品牌的鞋子中的第j个鞋子的标价,d[i][j].v表示第i种品牌的鞋子中的第j个鞋子价值.状态转

hdu 3033 I love sneakers!【详剖 DP 之 分组背包 】

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

HDU 3033 I love sneakers! 我爱运动鞋 (分组背包,01背包,严重变形)

题意:给出k家店,每家店内有各种价格的鞋子(同样的鞋子只能买一双),每双鞋子有价值,要求每家店至少买一双.给出m钱,求获得的最大价值. 思路:分组背包严重变形了,变成了相反的,每组物品至少挑1件(分组背包是至多挑1件).虽然是分组背包的变形,但是用到的却是01背包的思路.要求每家店至少买1双,那么可以只买一双双,也可以买多双.难点在这.需要维护两行dp状态值即可.第一行是前面组的物品的最佳状态,第二行是第i件物品之前的最佳状态(已经装进同组物品). 对于i组第t件物品,(1)要么从i组之前的状态