【HDU 6083 度度熊的午饭时光】 + dp

来源:互联网 发布:阿里云 app服务器搭建 编辑:程序博客网 时间:2024/04/29 03:28

度度熊的午饭时光

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”百度之星”程序设计大赛 - 资格赛

思路 : 01 背包,dp[i] 表示 i 价格可以吃到的最多得分的饭菜,vectro 记录所选的饭菜序号, 当序号和一样的时候,更新为序号和较小的路径(一开始题目没加字典序最下,所有没有考虑,后来在提交依然可以过,莫非题目没加考虑字典序的数据?~QAQ)

AC代码:

#include<cstdio>#include<cmath>#include<vector>#include<cstring>#include<algorithm>using namespace std;const int MAX = 1e3 + 10;typedef long long LL;struct node{    int v,c;}st[110];vector <int> v[MAX];int dp[MAX],d[MAX];int main(){    int b,n,nl = 0,T,ok = 0;    scanf("%d",&T);    while(T--){        scanf("%d %d",&b,&n);        memset(dp,0,sizeof(dp));        for(int i = 1; i <= n; i++)            scanf("%d %d",&st[i].v,&st[i].c);        for(int i = 0; i <= b; i++) v[i].clear();        for(int i = 1; i <= n; i++)            for(int j = b; j >= st[i].c;  j--){                if(dp[j] < dp[j - st[i].c] + st[i].v){                    dp[j] = dp[j - st[i].c] + st[i].v;                    v[j] = v[j - st[i].c];                    v[j].push_back(i);                }                else if(dp[j] == dp[j - st[i].c] + st[i].v){                    int sum = 0,ans = 0,p = j - st[i].c;                    for(int o = 0; o < v[j].size(); o++)                        sum += v[j][o];                    for(int o = 0; o < v[p].size(); o++)                        ans += v[p][o];                    if(sum > ans + i)                        v[j] = v[j - st[i].c],v[j].push_back(i);                }            }        printf("Case #%d:\n",++nl);        int pl = 0,o = 0;        for(int i = 0; i < v[b].size(); i++)            d[++pl] = v[b][i],o += st[v[b][i]].c;        printf("%d %d\n",dp[b],o);        if(pl == 0) continue;        for(int i = 1; i < pl; i++)            printf("%d ",d[i]);        printf("%d\n",d[pl]);    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米手机锁屏密码忘了怎么办? 小米平板电脑锁屏密码忘了怎么办 小米手机进水了黑屏了嗡嗡响怎么办 华为诺娃2手机声音小怎么办 华为平板锁屏密码忘记了怎么办 华为麦芒6手机按键摔坏了怎么办 定频空调加错了佛里昂怎么办 定频空调外机噪音大怎么办 老美的定频空调出现p0怎么办 华为揽阅m2青春版卡顿了怎么办 华为揽阅M2青春版发热卡顿怎么办 全民突击网速不给力经常掉线怎么办 华为手机微信视频黑屏了怎么办 相机拍照后找不到拍的照片怎么办 苹果手机下载软件不被信任怎么办 苹果x手机下载软件不受信任怎么办 华为畅享7plus主板坏了怎么办 华为手机手机主板坏了没备份怎么办 华为手机一年内主板坏了怎么办 华为手机保修期内主板坏了怎么办 华为手机外置sd卡满了怎么办 红米4充不进去电怎么办 苹果5s锁屏密码忘记了怎么办 华为手机桌面和锁屏自动一样怎么办 苹果手机没电了没带充电器怎么办 华为p8手机后摄像头模糊的怎么办 中兴手机充电的地方坏了怎么办? 小米手机与电脑蓝牙传输失败怎么办 捡个华为收机没有账号密码怎么办 华为手机p9激活码忘了怎么办 华为畅享7plus声音小怎么办 华为畅享7plus忘记密码怎么办 华为畅享8plus卡顿怎么办 华为畅享7plus卡机怎么办 华为畅享8plus图标字小怎么办 华为畅享6反应慢发热怎么办 华为畅享5S反应迟钝怎么办 华为畅玩5x玩王者荣耀卡怎么办 不小心把手机里的照片删了怎么办 u盘文件在手机上删了怎么办 荒野行动透视挂功能加载失败怎么办