HDU 6083 度度熊的午饭时光 (多限制0/1背包)

2024-03-20 12:58

本文主要是介绍HDU 6083 度度熊的午饭时光 (多限制0/1背包),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

度度熊的午饭时光

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


Problem Description
度度熊最期待每天的午饭时光,因为早饭菜品清淡,晚饭减肥不敢吃太多(胖纸的忧伤T.T)。

百度食堂的午餐超级丰富,祖国各大菜系应有尽有,度度熊在每个窗口都有爱吃的菜品,而且他还为喜爱的菜品打了分,吃货的情怀呀(>.<)。

但是,好吃的饭菜总是很贵,每天的午饭预算有限,请帮度度熊算一算,怎样打饭才能买到的最好吃的饭菜?(不超过预算、不重样、午餐等分最高的情况下,选择菜品序号加和最小,加和相等时字典序最小的组合)

Input
第一行一个整数T,表示T组数据。
每组测试数据将以如下格式从标准输入读入:

B

N

score_1 cost_1

score_2 cost_2

:

score_N cost_N
  
第一行,正整数B(0 <= B <= 1000),代表午餐的预算。

第二行,正整数N (0 <= N <= 100),代表午餐可选的菜品数量

从第三行到第 (N + 2) 行,每行两个正整数,以空格分隔,score_i表示菜品的得分,cost_i表示菜品的价格(0 <= score_i, cost_i <= 100)。

Output
对于每组数据,输出两行:
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出菜品的总得分和总花费,以空格分隔。
第三行输出所选菜品的序号,菜品序号从1开始,以空格分隔。

Sample Input
  
2 29 6 9 10 3 4 6 5 7 20 10 9 15 11 0 2 2 23 10 12

Sample Output
  
Case #1: 34 29 2 3 5 6 Case #2: 0 0

Source
2017"百度之星"程序设计大赛 - 资格赛
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6083

题目分析:0/1背包选择的时候记录一下当前的id和

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const INF = 0x7fffffff;
int dp[1005], s[105], c[105];
int N, B;struct DATA {int n, id[105], sum;
}d[1005];int main() {int T;scanf("%d", &T);for (int ca = 1; ca <= T; ca ++) {printf("Case #%d:\n", ca);scanf("%d %d", &B, &N);for (int i = 1; i <= N; i ++) {scanf("%d %d", &s[i], &c[i]);}memset(d, 0, sizeof(d));for (int i = 0; i <= B; i ++) {dp[i] = -INF;}dp[0] = 0;for (int i = 1; i <= N; i ++) {for (int j = B; j >= c[i]; j --) {if (dp[j] < dp[j - c[i]] + s[i] || (dp[j] == dp[j - c[i]] + s[i] && d[j].sum > i)) {dp[j] = dp[j - c[i]] + s[i];d[j] = d[j - c[i]];d[j].id[d[j].n ++] = i;d[j].sum += i;}}}int maxS = -INF, maxC, curMin = INF;for (int i = B; i >= 0; i--) {//printf("maxS = %d dp[%d] = %d\n", maxS, i, dp[i]);if (maxS < dp[i] || (maxS == dp[i] && curMin > d[i].sum)) {maxS = dp[i];maxC = i;curMin = d[i].sum;}}printf("%d %d\n", maxS, maxC);int sz = d[maxC].n;if (sz > 0) {for (int i = 0; i < sz - 1; i ++){printf("%d ", d[maxC].id[i]);}printf("%d\n", d[maxC].id[sz - 1]);}}
}


这篇关于HDU 6083 度度熊的午饭时光 (多限制0/1背包)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829529

相关文章

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO