题意:

  有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背包,变形)的更多相关文章

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

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

  2. [HDU 3033] I love sneakers! (动态规划分组背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033 题意:给你K种品牌,每种品牌有不同种鞋,现在每种品牌至少挑一款鞋,问获得的最大价值,如果不能每种 ...

  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. hdu 2126 Buy the souvenirs 【输出方案数】【01背包】(经典)

    题目链接:https://vjudge.net/contest/103424#problem/K 转载于:https://blog.csdn.net/acm_davidcn/article/detai ...

  6. 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 ...

  7. HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)

    Herbs Gathering 10.76% 1000ms 32768K   Collecting one's own plants for use as herbal medicines is pe ...

  8. HDU 3033 组合背包变形 I love sneakers!

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

  9. hdu 3033(好题,分组背包)

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

随机推荐

  1. SpringMVC笔记- 不配置HandlerMapping

    使用SpringMVC框架时发现有的配置了HandlerMapping,而有的没有,那么它们有什么区别呢?不配置能不能正常使用框架呢? 下面我们看一看不配置任何HandlerMapping时,框架会使 ...

  2. 11.ClientCredential模式总结

    11.ClientCredential模式总结 服务端定义的Resource叫做api Resource API默认是被保护的 第三方的客户端先去请求 Server拿到access token.带着t ...

  3. UVa 557 Burger (概率+递推)

    题意:有 n 个牛肉堡和 n 个鸡肉堡给 2n 个客人吃,在吃之前抛硬币来决定吃什么,如果剩下的汉堡一样,就不用投了,求最后两个人吃到相同的概率. 析:由于正面考虑还要要不要投硬币,太麻烦,所以我们先 ...

  4. 通过HTTP请求WEBAPI的方式

    平时工作中长期需要用到通过HTTP调用API进行数据获取以及文件上传下载(C#,JAVA...都会用到).这里获取的是包括网页的所有信息.如果单纯需要某些数据内容.可以自己构造函数甄别抠除出来!一般的 ...

  5. python-os.walk()使用举例

    文件目录结构 dir 1 1 1.txt 2.txt 3.txt 2 2.txt 3 4 4.txt 3.txt 1.txt 2 2.txt 3 3.txt dir.txt 代码: import os ...

  6. E20180512-hm

    travesal n. 横越,横断物,(横向)往返移动;

  7. IT兄弟连 JavaWeb教程 Cookie和Session应用结合使用

    一般对于不要求安全的非敏感数据,建议存储在Cookie中! 对于敏感的数据,占用空间较小的,建议存储在Session中! 对于敏感的,较大的数据,存数据库!

  8. Java常见设计模式学习(非原创)

    文章大纲 一.策略模式二.观察者模式三.工厂模式四.单例模式五.其他模式六.设计模式总结七.参考文章   一.策略模式 现在假设我们有个"鸭子项目",首先我们用OOP(面向对象)的 ...

  9. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  10. 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

    第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...