题目大意:xx去买鞋,有k种牌子,然后给出n双鞋,每双鞋有它属于的牌子、价格、收藏价值。xx认为他不差钱,要求每种鞋子买一双。但实际上他只有m毛钱,问能否买到符合xx要求的鞋,能找到的话输出最大的收藏价值总和。   分组背包的变形,每种牌子要求至少选一个,这与分组背包的每组最多选一个不一样,但背包的思想都是一样的。。。 就是状态转移的时候可以加上从上一组转移(选择1个)与本组转移(大于1个),还有注意枚举物品和枚举体积的顺序~~ 设dp[i][j]表示前i组填到容量j的最大价值, 则方程为:dp[i][j] = max(dp[i][j],dp[i-1][j-price[i][k]] + value[i][k],dp[i][j-price[[i][k]] + value[i][k])


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)>>1)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;typedef long long LL;
const int sup = 0x7fffffff;
const int inf = -0x7fffffff;struct shoes{int price;int value;
};
vector  s[11];int f[15][10100];
int N, M, K;int main(){while(scanf("%d %d %d", &N, &M, &K) != EOF){for (int i = 0; i < 11; i ++)s[i].clear();for (int i = 1; i <= N; i ++){int tmp_brand, tmp_price, tmp_value;scanf("%d %d %d", &tmp_brand, &tmp_price, &tmp_value);shoes tmp;tmp.price = tmp_price;tmp.value = tmp_value;s[tmp_brand].push_back(tmp);}mem(f, -1);f[0][0] = 0;for (int k = 1; k <= K; k ++)for (int j = 0; j < (int)s[k].size(); j ++)for (int v = M; v >= 0; v --){if (v-s[k][j].price >= 0 && f[k][v-s[k][j].price] != -1){f[k][v] = max(f[k][v], f[k][v-s[k][j].price]+s[k][j].value);}if (v-s[k][j].price >= 0 && f[k-1][v-s[k][j].price] != -1){f[k][v] = max(f[k][v], f[k-1][v-s[k][j].price]+s[k][j].value);}}int res = -1;for (int v = 0; v <= M; v ++)if (f[K][v] > res)res = f[K][v];if (res >= 0)printf("%d\n", res);elseprintf("Impossible\n");}return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/03/20/4114229.html

HDU 3033 I love sneakers! (分组背包变形)相关推荐

  1. hdu 5148 树形dp,分组背包

    题目: 题目分析: 状态方程: dp[当前节点的标号][当前已经选取的城市数] 设已经选取的城市数是K 初始状态: dp[u][0] = dp[u][1] = 0 , 其他的将值设置为无穷大 树形转移 ...

  2. 暑假N天乐 —— 多重+分组背包及变形

    [HDU-1114 Piggy-Bank] 完全背包裸题 http://acm.hdu.edu.cn/showproblem.php?pid=1114 一道迷路的完全背包跑到了这里来...相当于给定背 ...

  3. hdu 3033(分组背包)

    题意:有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大.如果 有一款买不到,就输出"Impossible". 解题思路:分组背包,和背包九 ...

  4. hdu3033(变形分组背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033 题意:Iserlohn要买鞋,有k种牌子,每种牌子至少买一双鞋子.每双鞋子有标价跟实际价值.求用 ...

  5. hdu 1712(分组背包)

    题意:有N个课程,然后选择M天内学习的效益最大值,注意每个课程最多选取一次. 解题思路:裸的分组背包,把每门课程看做是每一组,每一组里面最多选择一个天数,典型的分组背包.详见背包九讲 #include ...

  6. 分组背包----HDU1712 ACboy needs your help

    很简单的一道分组背包入门问题.不多解释了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...

  7. [bzoj1025][SCOI2009]游戏 (分组背包)

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一 且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,--,N写一排在纸上.然后再在这一排下面写上它们 ...

  8. zcmu2165(分组背包)

    2165: 黄金矿工 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 86  Solved: 41 [Submit][Status][Web Board ...

  9. 2019年湘潭大学程序设计竞赛(重现赛)补题:H.Chat(分组背包)

    链接:https://ac.nowcoder.com/acm/problem/25581 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

最新文章

  1. XPath实例教程四、[]的作用
  2. ContrainedBox:设置尺寸
  3. 两表格合并_六个高效办公Excel小技巧,让你提前下班两小时!
  4. 用java实现etcd分布式锁_etcd分布式锁及事务
  5. android-pageviewer实现linearlayout的切换
  6. zip、rar文件格式
  7. HDU 5934:Bomb(强连通缩点)
  8. SQL Server 字符串拆分
  9. 基于python实现网络课程秒刷
  10. 计算机从加电到启动系统时主板的工作流程,企业网络管理员面试题
  11. PC微信逆向之发送消息
  12. Android Studio 微信登录
  13. 争对让望对思野葛对山栀注解_解析
  14. 半导体——本征半导体、杂质半导体、PN结
  15. HihoCoder - 1847
  16. 《软技能,代码之外的生存指南》--教你如何当一名程序员
  17. Vortex: 一种基于RISC-V指令集自定义扩展的开源GPGPU架构
  18. 时空大数据与众包计算学习总结
  19. 关于海康摄像头的摘要认证(转载)
  20. JavaWeb QQ邮箱找回密码

热门文章

  1. SQL改變字符串標識符
  2. day_6:验证码识别
  3. OpenNebula学习第三节之虚拟机管理
  4. td 中连续数字或连续英文内容不自动换行
  5. 在程序中集成地址簿、电子邮件和地图功能
  6. 登录屏幕上不要显示上次登录的用户名 图文教程[server 2003/2008]
  7. HTTP_REFERER的获取情况
  8. CAS Tomcat配置
  9. java学习笔记(三)----成员权限,构造函数,this用法
  10. 华为vrrp默认优先级_华为eNSP配置VRRP协议实验