http://acm.hdu.edu.cn/showproblem.php?pid=3033

本题的意思就是说现在有n种牌子的鞋子,每种品牌有一些不同的鞋,每双鞋子都有一个特定的权值,现在要求每种品牌的鞋子都至少收集一双,有一定量的钱,问获得的最大的权值是多少。

这个题与普通的分组背包不同就在于每一组都至少选一个,(正好这个难道我了= =)

网上找了解题报告,解题方法很巧妙,就是先将每一个DP值初始化为一个值,比如-1,表示所有的状态都不合法

那么转移方程就是

                    if(DP[i][k-cost[i][j]] != -)
DP[i][k] = max(DP[i][k], DP[i][k-cost[i][j]]+val[i][j]);
if
(DP[i-][k-cost[i][j]] != -)
DP[i][k] = max(DP[i][k], DP[i-][k-cost[i][j]]+val[i][j]);

这样一来,如果要得到一个DP值,就必须从一个合法的状态得到,首先,如果DP[i][k-cost[i][j]]!=-1,那么说明这一层已经存放了物品,否则就是没有放那么就必须从上一层的状态转移得到。

得解。

见代码:

 #include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
#define lson k<<1, L, mid
#define rson k<<1|1, mid+1, R
#define mem0(a) memset(a,0,sizeof(a)) typedef long long LL;
const double eps = 1e-;
const int MAXN = ;
const int MAXM = ; int num[],cost[][], val[][];
int DP[][], sum;
int N, M, K; void init()
{
mem0(DP); mem0(cost);mem0(val);mem0(num);
num[] = ;
} void ReadData()
{
int a, b, c;
for(int i=;i<N;i++)
{
scanf("%d%d%d", &a, &b, &c);
cost[a][num[a]] = b;
val[a][num[a]] = c;
num[a]++;
}
} int main()
{
while(~scanf("%d %d %d", &N, &M, &K))
{
init();
ReadData();
for(int i=;i<=K;i++)
{
for(int j=;j<=M;j++)
{
DP[i][j] = i==?:-;
}
}
for(int i=;i<=K;i++)
{
for(int j=;j<num[i];j++)
{
for(int k=M;k>=cost[i][j];k--)
{
if(DP[i][k-cost[i][j]] != -)
DP[i][k] = max(DP[i][k], DP[i][k-cost[i][j]]+val[i][j]);
if(DP[i-][k-cost[i][j]] != -)
DP[i][k] = max(DP[i][k], DP[i-][k-cost[i][j]]+val[i][j]);
}
}
}
if(DP[K][M]<)printf("Impossible\n");
else printf("%d\n",DP[K][M]);
}
return ;
}

HDU3033I love sneakers!(分组背包)的更多相关文章

  1. hdu3033I love sneakers! (分组背包,错了很多次)

    Problem Description After months of hard working, Iserlohn finally wins awesome amount of scholarshi ...

  2. I love sneakers!(分组背包HDU3033)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 3033 I love sneakers! 分组背包

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. hdu 3033 I love sneakers!(分组背包+每组至少选一个)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu3033 I love sneakers! 分组背包变形

    分组背包要求每一组里面只能选一个,这个题目要求每一组里面至少选一个物品. dp[i, j] 表示前 i 组里面在每组至少放进一个物品的情况下,当花费 j 的时候,所得到的的最大价值.这个状态可以由三个 ...

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

    这个题很怪,一开始没仔细读题,写了个简单的分组背包交上去,果不其然WA. 题目分析: 分组背包问题是这样描述的:有K组物品,每组 i 个,费用分别为Ci ,价值为Vi,每组物品是互斥的,只能取一个或者 ...

  7. HD3033I love sneakers!(分组背包+不懂)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. HDU3033 I love sneakers!———分组背包

    这题的动态转移方程真是妙啊,完美的解决了每一种衣服必须买一件的情况. if(a[x][i-c[x][j].x]!=-1) a[x][i]=max(a[x][i],a[x][i-c[x][j].x]+c ...

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

    看了许多的题解,都有题目翻译,很不错,以后我也这样写.直接翻译样例: /*鞋子的数量N[1, 100]; 拥有的金钱M[1, 1w]; 品牌数目[1, 10]*/ /*以下四行是对于每双鞋的描述*/ ...

随机推荐

  1. ui/ue设计师应该了解的原型设计软件

    前段实践整理过一些原型设计用的软件,这里分享一下,喜欢对更多的PM战线的童鞋有所裨益.(因为交互原型工具Axure ui设计师都很常用了,文中就不专门介绍了) 首先分下类: •1.交互原型(产品能做什 ...

  2. ASP.NET MVC 4 WebAPI. Support Areas in HttpControllerSelector

    This article was written for ASP.NET MVC 4 RC (Release Candidate). If you are still using Beta versi ...

  3. IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态

    一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...

  4. mysql装载本地文件及模式匹配

    使用load data装载本地文件到表中,文件每行一条记录,列值之间用tab分隔,并按照次序一一列出,对于无值或丢失的情况可以使用\N.但是在使用insert into插入的时候不能使用\N,而应该是 ...

  5. 07day1

    怒跪了.   砍树 排序 [问题描述] 小 A 在一条水平的马路上种了 n 棵树,过了几年树都长得很高大了,每棵树都可以看作是一条长度为 a[i]的竖线段.由于有的树过于高大,挡住了其他的树,使得另一 ...

  6. 【C#学习笔记】改变颜色

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. Github托管代码步骤

    总结一下Github上项目托管步骤: Step 1:注册Github帐号,并创建一个repository,假如仓库名为test: Step 2:安装本地Git: sudo apt-get instal ...

  8. final修饰符,finally,finalize区别

    1.final 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此,一个类不能即被声明为abstract,又被声明为final.将变量或方法声明为final,可以保证 ...

  9. 如何调试Android Framework?

    Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...

  10. 开发者必读jQuery Mobile入门教程

    你每天都会对着它讲话,和它玩游戏,用它看新闻——没错,它就是你裤兜里的智能手机.android,黑莓还是iphone?为了让你清楚意识到究竟哪些才算是智能手机,我在下面总结了一个智能手机系统/设备的列 ...