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>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define INF 1e8
#define eps 1e-8
#define LL long long
#define maxn 127
#define PI acos(-1.0)

struct node
{
	int v,p;
}f[11][10005];
int main()
{
	int n,m,k;
	int dp[11][10005];
	while(~scanf("%d%d%d",&n,&m,&k))
	{
		int i,j;
		int a,b,c;
		int kao[15];
		memset(kao,0,sizeof(kao));
		memset(f,0,sizeof(f));
		for(i=0;i<n;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			f[a][kao[a]].p=b;
			f[a][kao[a]++].v=c;
		}
		memset(dp,-1,sizeof(dp));
		memset(dp[0],0,sizeof(dp[0]));
		int h;
		for(i=1;i<=k;i++)
		{
			for(h=0;h<kao[i];h++)
			{
				for(j=m;j>=f[i][h].p;j--)
				{
					if(dp[i][j-f[i][h].p]!=-1)//由当前状态转移
						dp[i][j]=max(dp[i][j],dp[i][j-f[i][h].p]+f[i][h].v);

					if(dp[i-1][j-f[i][h].p]!=-1)//由上一状态转移
						dp[i][j]=max(dp[i][j],dp[i-1][j-f[i][h].p]+f[i][h].v);
				}
			}
		}
		if(dp[k][m]==-1) printf("Impossible\n");
		else
			printf("%d\n",dp[k][m]);
	}
	return 0;
}
/*
5 10 3
1 4 6
2 5 7
3 4 99
1 55 77
2 44 66
*/

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

时间: 2024-08-09 07:26:33

HDU 3033 I love sneakers! (01背包+反分组背包)的相关文章

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!(分组背包,每组至少取一件)

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[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!

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

HDU 4003 Find Metal Minaral 树上瞎搞分组背包

对于分组背包,每组选且只选一件商品的写法只想出了二维数组的写法. dp[s][k] 表示 在前s类中选取价格为 k 的商品的最优解. dp[s][k] = max( dp[s-1][k-product[s][j].c] + product[s][j].w).dp[s][k]每次只会有dp[s-1]更新得到,保证了前s-1类商品的选取. 对于此题,可以把每棵子树的情况看成一类商品,递归求解. dp[s][k]表示在s子树上投入k个机器人时的最优解. 当k == 0时,表示在s点投入1个机器人,且此

背包整理(01背包,完全背包,多重背包,分组背包)(待更新)

目录 01背包 优化(空间) 完全背包 优化 多重背包 优化 分组背包 01背包 有N件物品和一个容量为V的背包.第i件物品的价格(即体积,下同)是w[i],价值是c[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 对于每个物品,我们有两种选择:把这个物品放进背包还是不放. d[i][v]表示前i件物品,恰放入容积为v的背包时的价值总和. 状态转移方程为 \[d[i][v] = \max(d[i - 1][v],d[i - 1][v - w[i]] + c[i

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

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

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

【背包问题】0-1背包、完全背包、多重背包、混合三种背包、二位费用背包、分组背包

一.0-1背包问题 输入:第一行物品的个数n,第二行背包的质量m,随后n行每行给出每个物品的重量和价值,每种物品只有一个. 输出:背包可以达到的最大价值 样例输入: 5 10 1 5 2 4 3 3 4 2 5 1 样例输出: 14 动态规划的过程中需要逆序,因为如果不是逆序那么 当i=0的时候 f[0]=0; f[1]=max(f[1],f[1-w[0]]+v[0])=5; f[2]=max(f[2],f[2-w[0]]+v[0])=10; f[3]=max(f[3],f[3-w[0]]+v[