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

题意:Iserlohn要买鞋,有k种牌子,每种牌子至少买一双鞋子。每双鞋子有标价跟实际价值。求用m多的钱买最多价值的鞋。

分析:分组背包是有k组物品,每组至多取一件或不取,用容量为v的背包装最多价值的物品。而这题是至少每组取一件。

状态方程dp[k][m] 表示已经买了k种鞋 在有m钱状态下的鞋的最大价值。

为了满足至少每组取一件,则加了这组状态转移方程:

if(dp[k-1][j-b[i]]+c[i]!=-1)dp[k][j]=max(dp[k][j],dp[k-1][j-b[i]]+c[i]);

初始化dp数组为-1很重要,若dp[k][j]=-1,说明该种状态无法达到。

dp[0]全部置为0,就是为了满足第一种能一定在v体积范围内一定取得到,同样只要剩余的空间满足第二种物品体积,那么它也会一定取得道,这样每种种物品第一件会把dp[k]数组更新为一遍,所以当该种物品还有多件物品时,就可用01背包取或不取来进行决策。即

if(dp[k][j-b[i]]!=-1)dp[k][j]=max(dp[k][j],dp[k][j-b[i]]+c[i])

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 10010
using namespace std;
int dp[15][N],a[110],b[110],c[110];
int main()
{int n,m,kind;while(scanf("%d%d%d",&n,&m,&kind)>0){for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);memset(dp,-1,sizeof(dp));memset(dp[0],0,sizeof(dp[0]));for(int k=1;k<=kind;k++)for(int i=1;i<=n;i++)if(a[i]==k)for(int j=m;j>=b[i];j--){if(dp[k][j-b[i]]!=-1)dp[k][j]=max(dp[k][j],dp[k][j-b[i]]+c[i]);if(dp[k-1][j-b[i]]!=-1)dp[k][j]=max(dp[k][j],dp[k-1][j-b[i]]+c[i]);}if(dp[kind][m]==-1)puts("Impossible");else printf("%d\n",dp[kind][m]);}
}

View Code

转载于:https://www.cnblogs.com/lienus/p/4151030.html

hdu3033(变形分组背包)相关推荐

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

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

  2. HDU 3033 I love sneakers! (分组背包变形)

    题目大意:xx去买鞋,有k种牌子,然后给出n双鞋,每双鞋有它属于的牌子.价格.收藏价值.xx认为他不差钱,要求每种鞋子买一双.但实际上他只有m毛钱,问能否买到符合xx要求的鞋,能找到的话输出最大的收藏 ...

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

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

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

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

  5. hdu 1712(分组背包)

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

  6. hdu 3033(分组背包)

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

  7. zcmu2165(分组背包)

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

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

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

  9. P1064 金明的预算方案(分组背包)

    https://www.luogu.org/problemnew/show/P1064 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...

最新文章

  1. AI版「盗梦空间」?谷歌大脑「世界模型」可实现在其梦境中对智能体进行训练
  2. 4Python切片功能剖析
  3. springboot整合rpc远程调用_SpringCloud—RPC远程调用
  4. DB2 SQL性能调优秘笈
  5. 在哪里学python-python在哪学
  6. 【java虚拟机序列】java中的垃圾回收与内存分配策略
  7. Visio常用快捷键
  8. window-linux移植
  9. 不要找我了,我要去盘核桃了!
  10. 打造前端MAC工作站(五)让我们熟悉一下 MAC 命令行吧!
  11. 信息与熵【上】生命以信息为食
  12. AutoCAD .Net 创建直线Line
  13. 乘风破浪的码农——仿佛身体被掏空
  14. 微信小程序python解析获取用户手机号_微信小程序如何获取用户绑定手机号
  15. vue+ElementUI页面模板
  16. Joan Baez - Willie Moore
  17. 中国“计算机天才”魏延政:入职华为年薪百万,抗癌5年41岁去世
  18. MySql分表、分库、分片和分区知识
  19. C\C++杀不死的进程
  20. Ubuntu内存清理

热门文章

  1. php7 返回静态类,PHP7 – 未捕获错误:访问未声明的静态属性
  2. python具有可嵌入性_如何构建可嵌入Python
  3. servlet 返回可访问文件_Windows 10 可直接访问 Linux 文件
  4. css手型指针_前端基础面试题(HTML+CSS部分)
  5. keil5安装_Keil 5安装教程
  6. python列表方法图解_python中list(列表)的使用方法总结(图文)
  7. linux mysql查看所有表_Linux之系统操作命令
  8. mysql数据库学习6_MySQL学习(六)
  9. 双目测距(六)--三维重建及UI显示
  10. 前景检测算法(三)--帧差法