I love sneakers!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4919    Accepted Submission(s): 2022

Problem Description
After
months of hard working, Iserlohn finally wins awesome amount of
scholarship. As a great zealot of sneakers, he decides to spend all his
money on them in a sneaker store.

There
are several brands of sneakers that Iserlohn wants to collect, such as
Air Jordan and Nike Pro. And each brand has released various products.
For the reason that Iserlohn is definitely a sneaker-mania, he desires
to buy at least one product for each brand.
Although the fixed price
of each product has been labeled, Iserlohn sets values for each of them
based on his own tendency. With handsome but limited money, he wants to
maximize the total value of the shoes he is going to buy. Obviously, as a
collector, he won’t buy the same product twice.
Now, Iserlohn needs
you to help him find the best solution of his problem, which means to
maximize the total value of the products he can buy.
 
Input
Input
contains multiple test cases. Each test case begins with three integers
1<=N<=100 representing the total number of products, 1 <=
M<= 10000 the money Iserlohn gets, and 1<=K<=10 representing
the sneaker brands. The following N lines each represents a product with
three positive integers 1<=a<=k, b and c, 0<=b,c<100000,
meaning the brand’s number it belongs, the labeled price, and the value
of this product. Process to End Of File.
 
Output
For
each test case, print an integer which is the maximum total value of
the sneakers that Iserlohn purchases. Print "Impossible" if Iserlohn's
demands can’t be satisfied.
 
Sample Input
5 10000 3
1 4 6
2 5 7
3 4 99
1 55 77
2 44 66
 
Sample Output
255
开始写始终WA,初始化有问题。。。看题解才发现原来选择的顺序也有讲究,又长见识了。
题意:一些鞋子有k种品牌,第k种牌子的鞋子里面有一些品种不同的鞋子,每种都有自己的价格和价值,收藏家有m元想收集每种品牌的鞋子至少一双(但是相同品牌相同品种的鞋他只要一双),问他总共可以收集多少价值的鞋子。
分析:有k个品牌,分组背包问题,《背包九讲》是每组最多选一件,这里不同,是选至少一件,我们对每组
进行01背包就行了.我们当前选第k组的时候在里面选择物品的时候是选的第几件.如果我们当前是选第k组中的第一件,那么是从第k-1组推过来的,如果不是取第一件(i),
那么就是第k组中的前一件(i-1)推过来的.
以下内容就是这题的精(da)华(keng)了:
但是这里有个非常重要的问题,我们写成要写成如下形式两个if不能调转:
if(dp[k][v-price[i]] != -1)
        dp[k][v] = max(dp[k][v] , dp[k][v - price[i]] + value[i]);
if(dp[k-1][v-price[i]] != -1 )
        dp[k][v] = max(dp[k][v] , dp[k-1][v-price[i]] + value[i]);
解释:顺序不能调转,因为如果代价为0,调转的话,有可能出现先有dp[k][v] = dp[k-1][v-0]+v,再有dp[k][v] =dp[k][v-0]+v = dp[k-1][v-0]+v+v,所以物品取了两次.
当然一种方便的解决办法是直接写个函数 a = max(a,b,c);
还有个重要的地方是初始化:如果我们一开始把dp初始化为0,则当所有鞋子的价值都是0时,我们就无法区分是买不全那几款鞋子还是能买全但最大价值是0
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 10005
using namespace std; int dp[][N]; ///dp[k][i] 代表在前k组中花费i取得的最大价值
int a[],price[],value[];
int main()
{
int n,m,K;
while(scanf("%d%d%d",&n,&m,&K)!=EOF)
{
for(int i=; i<=n; i++)
{
scanf("%d%d%d",&a[i],&price[i],&value[i]);
}
memset(dp,-,sizeof(dp)); ///-1表示状态不合法
for(int i=; i<=m; i++) dp[][i]=;
for(int k=; k<=K; k++)
{
for(int i=; i<=n; i++)
{
if(a[i]==k)
for(int v=m; v>=price[i]; v--)
{
if(dp[k][v-price[i]] != -)
dp[k][v] = max(dp[k][v] , dp[k][v - price[i]] + value[i]);
if(dp[k-][v-price[i]] != - )
dp[k][v] = max(dp[k][v] , dp[k-][v-price[i]] + value[i]);
}
}
}
if(dp[K][m]==-) printf("Impossible\n");
else printf("%d\n",dp[K][m]);
}
return ;
}

hdu 3033(好题,分组背包)的更多相关文章

  1. hdu 1561 树形dp+分组背包

    题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...

  2. hdu 4003 树形dp+分组背包 2011大连赛区网络赛C

    题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 ...

  3. ACboy needs your help(HDU 1712 分组背包入门)

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. HDU 1712 ACboy needs your help (分组背包模版题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 有n门课,和m天时间.每门课上不同的天数有不同的价值,但是上过这门课后不能再上了,求m天里的最大 ...

  5. HDU 3033 分组背包变形(每种至少一个)

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

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

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

  7. HDU 3033 分组背包(至少选一个)

    分组背包(至少选一个) 我真的搞不懂为什么,所以现在就只能当作是模板来用吧 如果有大牛看见 希望评论告诉我 &代码: #include <cstdio> #include < ...

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

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

  9. HDU 3033 I love sneakers! 我爱运动鞋 (分组背包+01背包,变形)

    题意: 有n<=100双鞋子,分别属于一个牌子,共k<=10个牌子.现有m<=10000钱,问每个牌子至少挑1双,能获得的最大价值是多少? 思路: 分组背包的变形,变成了相反的,每组 ...

随机推荐

  1. Excel:函数中的万金油:INDEX+SMALL+IF+ROW

      很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP.INDEX+MATCH中入门的,纵然你把全部的多条件查找 ...

  2. python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类

    自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...

  3. python---django请求-响应的生命周期(FBV和CBV含义)

    Django请求的生命周期是指:当用户在访问该url路径是,在服务器Django后台都发生了什么. 客户端发送Http请求给服务端,Http请求是一堆字符串,其内容是: 访问:http://crm.o ...

  4. hdu 5079 Square

    http://acm.hdu.edu.cn/showproblem.php?pid=5079 题意: n*n网格,每个格子可以涂黑色或白色,有的格子必须涂黑色 问最大白色正方形边长分别为0,1,2,… ...

  5. H5 Day1 练习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Linux 网卡流量查看

    网卡流量查看 watch more /proc/net/dev # 实时监控流量文件系统 累计值 iptraf # 网卡流量查看工具 nethogs -d 5 eth0 eth1 # 按进程实时统计网 ...

  7. centos7系统下安装配置jdk、tomcat教程

    JDK安装与配置 1.下载linux版本的jdk,我下的版本是jdk6.0,下载rpm版本的. 可通过百度搜索文件名:jdk-6u45-linux-x64-rpm.bin下载 也可通过oracle官网 ...

  8. nginx安装报错:configure: error: the HTTP rewrite module requires the PCRE library

    参考:http://blog.51cto.com/williamx/958398 需要安装pcre-devel与openssl-devel yum -y install pcre-devel open ...

  9. linux服务器安装anaconda,然后远程使用jupyter

    linux服务器安装anaconda: 1.1 下载安装脚本: wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64. ...

  10. Android 4.4 API

    Android 4.4 (KITKAT) 是新的 Android 平台版本,为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的新 API. 作为应用开发者,您应尽快从 SDK 管理器下载 A ...