HDU 3033 I love sneakers! 我爱运动鞋 (分组背包+01背包,变形)
题意:
有n<=100双鞋子,分别属于一个牌子,共k<=10个牌子。现有m<=10000钱,问每个牌子至少挑1双,能获得的最大价值是多少?
思路:
分组背包的变形,变成了相反的,每组物品至少挑1件(分组背包问题是至多挑1件)。
由于每个牌子至少买1双,那么可以先装一件最便宜的进去,如果有好的再更新(注意每次的容量下限)。而且同一双鞋子不能多次购买,这里要用01背包。对于当前容量cap,可能只装了某一牌子的一双鞋子(不一定最便宜),也可能装了多双,也可能只装了那双硬塞进去的最便宜的。
注意点:有的店可是不一定有鞋子的;可能某个牌子连一双都买不起;可能买不全所有牌子。
重写了次:
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <deque>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define back que[rear-1]
#define INF 0x3f3f3f3f
#define LL long long
#define ULL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
int dp[][N];
struct node
{
int p,v;
}r;
vector<node> vect[N];
inline int cmp(node a,node b){return a.p<b.p;}
bool cal(int n,int m,int k)
{
for(int i=; i<=n; i++) //排序方便处理
sort(vect[i].begin(),vect[i].end(),cmp);
int sum=; //最便宜的鞋子价钱之和
for(int i=; i<=k; i++) //枚举组
{
if(vect[i].empty()) return false; //无鞋 node a=vect[i][];
for(int j=m; j-a.p>=sum; j--) //先装进去一个最便宜的
dp[i][j]=dp[i-][j-a.p]+a.v; for(int t=; t<vect[i].size(); t++) //考虑此组其他鞋
{
a=vect[i][t];
for(int j=m; j-a.p>=sum; j--)
{
dp[i][j]=max(dp[i][j], dp[i-][j-a.p]+a.v ); //注意点
dp[i][j]=max(dp[i][j], dp[i][j-a.p]+a.v );
}
}
sum+=vect[i][].p;
if(sum>m) return false; //买不起
}
return true;
} int main()
{
//freopen("input.txt", "r", stdin);
int w, n, m, k;
while(cin>>n>>m>>k) //n双鞋子,m钱,k个牌子
{
memset(dp,,sizeof(dp));
for(int i=; i<=k; i++) vect[i].clear();
for(int i=; i<=n; i++)
{
scanf("%d%d%d", &w, &r.p, &r.v);
vect[w].push_back(r); //分组保存
}
if(cal(n,m,k)) printf("%d\n",dp[k][m]);
else printf("Impossible\n");
}
return ;
}
AC代码
#include <bits/stdc++.h>
using namespace std;
int n, m, k, w, dp[][];
struct node
{
int p,v;
}r;
vector< vector<node> > vect;
inline int cmp(node a,node b){return a.p< b.p? : ;}
int cal()
{
memset(dp,,sizeof(dp));
int up=;
for(int i=; i<=k; i++) //每组
{
r=vect[i][];
for(int j=m; j>=up+r.p; j--) //先装进去每组中最便宜的一个,有更好的再更新
dp[i][j]=dp[i-][j-r.p]+r.v; for(int t=; t<vect[i].size(); t++)//同组每种鞋
{
r=vect[i][t];
for(int j=m; j>=up+r.p; j--) //每种容量。注意下限是前面所有店的最便宜鞋价的总和。最差也能买上前面所有店的最便宜的鞋子,其他都是无效的状态。
{
dp[i][j]=max(dp[i][j], dp[i-][j-r.p]+r.v ); //单独放。
dp[i][j]=max(dp[i][j], dp[i][j-r.p] +r.v ); //配合同组放。
}
}
up+=vect[i][].p; //更新下限
}
if(dp[k][m]>) return ;
else return ;
}
void init()
{
vect.clear();
vector<node> tmp;
for(int i=; i<=k; i++) vect.push_back(tmp);
} int main()
{
freopen("input.txt", "r", stdin);
while(cin>>n>>m>>k)
{
init();
for(int i=; i<n; i++)
{
scanf("%d%d%d", &w, &r.p, &r.v);
vect[w].push_back(r);//分组保存
}
int big=;
for(int i=; i<=k; i++)
{
sort(vect[i].begin(), vect[i].end(), cmp); //排个序,最低价的排在前面
if(!vect[i].empty()) big+=vect[i][].p; //坑在这,有的店完全没有鞋子!
else big=0x7fffffff;//既然没有鞋子,置为无穷大,表示买不起。
}
if(big>m){printf("Impossible\n");continue;} //每家店最便宜的鞋子都买不起
if(cal()) printf("%d\n",dp[k][m]);
else printf("Impossible\n");
}
return ;
}
AC代码
HDU 3033 I love sneakers! 我爱运动鞋 (分组背包+01背包,变形)的更多相关文章
- hdu 3033 I love sneakers! 分组背包
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- [HDU 3033] I love sneakers! (动态规划分组背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033 题意:给你K种品牌,每种品牌有不同种鞋,现在每种品牌至少挑一款鞋,问获得的最大价值,如果不能每种 ...
- hdu 3033 I love sneakers!
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3033 I love sneakers!(分组背包+每组至少选一个)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 2126 Buy the souvenirs 【输出方案数】【01背包】(经典)
题目链接:https://vjudge.net/contest/103424#problem/K 转载于:https://blog.csdn.net/acm_davidcn/article/detai ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)
Herbs Gathering 10.76% 1000ms 32768K Collecting one's own plants for use as herbal medicines is pe ...
- HDU 3033 组合背包变形 I love sneakers!
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 3033(好题,分组背包)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- HTML5的LocalStorage实现记住密码
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 localStorage ...
- 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上
一.数据仓库架构 二.flume收集数据存储到hdfs 文档:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hd ...
- Subresource Integrity(子资源一致性)和JS DDos 攻击
以下文章转载自 http://www.cnblogs.com/zoucaitou/p/4505483.html 和 http://www.puronglong.com/blog//2015/04/12 ...
- [工具分享]wingide 6 算号代码keygen
import string import random import sha BASE16 = '0123456789ABCDEF' BASE30 = '123456789ABCDEFGHJKLMNP ...
- CodeForces Gym 100685I Innovative Business (贪心)
题意:给定一条路的长和宽,然后给你瓷砖的长和宽,你只能横着或者竖着铺,也可以切成片,但是每条边只能对应一条边,问你最少要多少瓷砖. 析:先整块整块的放,然后再考虑剩下部分,剩下的再分成3部分,先横着, ...
- Mac下intellij IDEA新建javaweb项目
intellij IDEA可以说是非常好用的工具,本人用来开发java.比eclipse等好用太多了.谁用谁知道,当然只是开发工具而已,用什么都无所谓.大牛们都用记事本编程呢. 本文帮助新手创建一个j ...
- spring中的依赖注入
Ioc的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理: 以后都交给Spring来维护 在当前类需要用到其他类的对象,由Spring为我们提供, 我们只需要在配置文件中说明 依赖关系的维护,就称 ...
- TP5之页面跳转样式
1.效果图 2.上干货 为了增加对移动设备的支持,在 /application/common.php加入以下函数: function isMobile() { if (isset ($_SERVER ...
- DOM中元素节点、属性节点、文本节点的理解13.3
节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是:nodeName(节点名称) nodeValue(节点值) nodeType(节点类型) nodeType nodeType 属性可返 ...
- HihoCoder 1121二分图一•二分图判定
背景: 个名字,表示这两个人有一场相亲.由于姑姑年龄比较大了记性不是太好,加上相亲的人很多,所以姑姑一时也想不起来其中有些人的性别.因此她拜托我检查一下相亲表里面有没有错误的记录,即是否把两个同性安排 ...