度度熊的午饭时光

 Accepts: 346
 Submissions: 5127
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 32768/32768 K (Java/Others)

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

一开始题目没有提示,后来加上了

坑点主要是要输出路径,而且这个路径必须满足序号之和最小,并且在这个情况下字典序最小

记录路径我是开了二维数组:

dp[x][y].val表示遍历到第x个物品总费用为y的情况下最大价值

dp[x][y].sum表示当前序号之和,如果最大价值相同,当然取序号和最小的

dp[x][y].pre表示你取的最后一个物品编号,因为dp时就是物品编号小到大的顺序dp的所以这个一定是当前最小

(如果dp[x][y]可以从某个物品转移过来,很显然dp[x][y].pre==x,

如果不能转移就让dp[x][y].pre==dp[x-1][y].pre)

具体转移看程序吧

#include<stdio.h>
#include<string.h>
#define inf 1044266558
typedef struct
{int val;int p;
}Res;
typedef struct
{int val;int pre;int sum;
}Bet;
Bet dp[105][1005];
Res s[105];
int p[105];
int main(void)
{int T, V, n, i, j, k, ans, sum, now, ts, cas = 1;scanf("%d", &T);while(T--){scanf("%d%d", &V, &n);for(i=1;i<=n;i++)scanf("%d%d", &s[i].val, &s[i].p);memset(dp, 62, sizeof(dp));dp[0][0].val = dp[0][0].sum = dp[0][0].pre = 0;for(i=1;i<=n;i++){for(j=V;j>=s[i].p;j--){dp[i][j] = dp[i-1][j];if((dp[i][j].val<dp[i-1][j-s[i].p].val+s[i].val || dp[i][j].val==inf) && dp[i-1][j-s[i].p].val<inf){dp[i][j].val = dp[i-1][j-s[i].p].val+s[i].val;dp[i][j].pre = i;dp[i][j].sum = dp[i-1][j-s[i].p].sum+i;}else if(dp[i][j].val==dp[i-1][j-s[i].p].val+s[i].val){if(dp[i][j].sum>dp[i-1][j-s[i].p].sum+i){dp[i][j].pre = i;dp[i][j].sum = dp[i-1][j-s[i].p].sum+i;}}}for(;j>=0;j--)dp[i][j] = dp[i-1][j];}ans = sum = -1, k = 0;for(i=V;i>=0;i--){if(dp[n][i].val<inf && dp[n][i].val>ans)ans = dp[n][i].val, sum = i, ts = dp[n][i].sum;else if(dp[n][i].val==ans){if(dp[n][i].sum<ts)sum = i, ts = dp[n][i].sum;}}printf("Case #%d:\n%d %d\n", cas++, ans, sum);now = n;while(dp[now][sum].pre){p[++k] = dp[now][sum].pre;ts = dp[now][sum].pre;now = ts-1;sum -= s[ts].p;}if(k==0)continue;printf("%d", p[k]);for(i=k-1;i>=1;i--)printf(" %d", p[i]);printf("\n");}return 0;
}

2017百度之星资格赛:1004. 度度熊的午饭时光(01背包+记录路径)相关推荐

  1. 2017百度之星资格赛—1003度度熊与邪恶大魔王

    其他题目就不发博客了(有些也没做出来!!),感觉这次百度之星资格赛题目数据有毒,吐槽,其他题目也不好说,感觉这个题目正常点. 这个题目我当时想到的就是动态规划,但是评论中很多人说是贪心,我一直不理解, ...

  2. 2017百度之星 资格赛1003度度熊与邪恶大魔王

    1003度度熊与邪恶大魔王 Accepts: 1503 Submissions: 9026 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 3 ...

  3. 2017百度之星资格赛1003 度度熊与邪恶大魔王(完全背包)

    题意: 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来.邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力.度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的 ...

  4. 2017百度之星资格赛 1003 度度熊与邪恶大魔王

    本题我们可以类比背包 背包dp[i][j] 表示再有i个物品下j个空间所获得的最大价值 本题dp[i][j] 可以表示干掉i个血量j个防御力下的最小花费 我们看其实我们就是在不同血量之间转移 如果当前 ...

  5. 2017百度之星 资格赛 1003 度度熊与邪恶大魔王(dp)

    #代码: #include<bits/stdc++.h> #define MAXN 1050using namespace std; int n,m; long long int dp[M ...

  6. 百度之星资格赛1003 度度熊与邪恶大魔王(dp)--2017

    度度熊与邪恶大魔王 Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊 ...

  7. 百度之星资格赛1003 度度熊与邪恶大魔王

    Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式 ...

  8. (百度之星资格赛) 度度熊与邪恶大魔王 (dp)

    度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石 ...

  9. 百度之星资格赛 1003 度度熊与邪恶大魔王 DP 完全背包

    题目链接: http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1003 题目大意: a[i], ...

  10. 百度之星资格赛 1003 度度熊与邪恶大魔王(二维dp)

    分析 挺好的一道题 dp[i][j]表示打败i颗血j防御力的怪兽需要的最少宝石数 然后就好了,复杂度\(O(n+m*1000*10)\) #include <bits/stdc++.h> ...

最新文章

  1. 数据结构1:单链表反转java代码解释
  2. jqprintsetup已经安装还会提示_英雄联盟PBE服务器安装指南 抢先体验新模式“云顶之弈”不用等...
  3. Ubuntu下安装Wine可能导致假死问题解决方案
  4. 嵌入式linux字符设备驱动
  5. Spring相关笔记整理
  6. python软件下载视频教程-Python视频教程下载:Python从入门到精通【传智播客】
  7. editor修改样式 vue_vue修改富文本中的元素样式
  8. doc转换html软件,Doc文件格式转换工具(CoolUtils Total Doc Converter)
  9. SOA架构,面向信号怎么就不香了,以及工程师的四个技术维度:编程,架构,网络,工具
  10. 亿图图示上线小程序,MindMaster移动端迎来大更新,亿图软件八周年再出发
  11. HDMI信号1分2--MS9332分配器
  12. 汉语属于哪个语系_汉语,日语,韩语分别属于什么语系?
  13. php批量格式化工具下载,源代码格式化工具Co
  14. VisualVM使用方法
  15. POI使用word模板文件循环输出行并导出word
  16. android盒子 小米遥控,小米盒子遥控器手机版下载-小米盒子遥控器appv6.0.0 安卓版 - 极光下载站...
  17. 乐视网今日开市起停牌 深交所将作出是否暂停上市的决定
  18. 《算法导论》第三版第31章 数论算法 练习思考题 个人答案
  19. 疯狂鼹鼠 java,神话延续! 光滑镜面时尚MOTO轻薄W220详尽评测
  20. 《数据结构-耿国华第三版》算法要点总结

热门文章

  1. 广义S变换的地震高分辨率处理中的应用
  2. 小甲鱼c语言_Tip:一起做一个平平无奇的程序小天才吧
  3. 冲压模板自动标注LISP_CAD AutoLisp实现自动标注序号
  4. 【Linux】C语言——贪吃蛇
  5. 使用python读写xlsx格式中的数据【xlrd、pywin32】
  6. C#操作Access数据库(查询,更新,插入)
  7. 系统版本与服务器版本不一致,服务器sql版本不一致,请问如何恢復备份
  8. 学习哪一款EDA软件画PCB电路板比较好?AD、PADS与Allegro的比较
  9. InVEST模型(生态系统服务)
  10. Lauterbach trace32与 jlink