百度之星资格赛 1004 度度熊的午饭时光(01背包+最小序号和+字典序+有bug)
分析
首先声明一下,我的代码有漏洞的,求大神给个正确代码
思路如下:
首先做一遍01背包记录路径并求出最大总分,令path[i][j]表示第i个物品包含在dp[j]的求值过程中.再逆序枚举money,如果dp[money]为最大总分,那么用c[num][j]保存物品并排序,并用mark记录序号最小并且字典序最小的那一个num,最后对c[mark][1]~c[mark][c[mark][0]]处理即可
trick
但是有一组数据很奇怪啊
5 4 1 1 2 2 3 3 4 4,应该输出5 5 1 4,但是我的程序输出5 5 2 3,然后我修改了if(dp[j]<dp[j-cost[i]]+score[i])为if(dp[j]<=dp[j-cost[i]]+score[i]),输出对了,交上去wa了,求一个正确代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
int t;
int money,n;
int cost[111],score[111];
int dp[1010];
int path[1010][1010];//path[i][j]表示第i个物品包含在dp[j]的求值过程中
int c[1010][1010];
int maxscore,maxsum;
int check(int num,int mark)
{
int cnt1=c[num][0],cnt2=c[mark][0];
for(int i=1,j=1;i<=cnt1&&j<=cnt2;++i,++j) if(c[num][i]!=c[mark][j]) return c[num][i]-c[mark][j];
return 0;
}
int main()
{
scanf("%d",&t);
F(qq,1,t)
{
scanf("%d%d",&money,&n);
F(i,1,n) scanf("%d %d",score+i,cost+i);
mem(dp,0);mem(path,0);
F(i,1,n)
{
for(int j=money;j>=cost[i];j--)
{
if(dp[j]<dp[j-cost[i]]+score[i])
{
path[i][j]=1;
dp[j]=dp[j-cost[i]]+score[i];
}
}
}
maxscore=dp[money];
int num=0,mark=0;
maxsum=1e9;
for(int j=money;j>=0;--j) if(dp[j]==maxscore)
{
int cnt=0,k=j,sum=0;//序号和
for(int i=n;i>=1&&k>=0;i--) if(path[i][k])
{
c[num][++cnt]=i;
k-=cost[i];
sum+=i;
}
c[num][0]=cnt;
sort(c[num]+1,c[num]+1+cnt);
if(maxsum>sum)
{
maxsum=sum;
mark=num;
}
else if((maxsum==sum)&&check(num,mark)<0) mark=num;
++num;
}
int maxcost=0,cnt=c[mark][0];
F(i,1,cnt) maxcost+=cost[c[mark][i]];
printf("Case #%d:\n",qq );
printf("%d %d\n",maxscore,maxcost );
F(i,1,cnt) printf("%d%c",c[mark][i],i==cnt?'\n':' ' );
}
return 0;
}
百度之星资格赛 1004 度度熊的午饭时光(01背包+最小序号和+字典序+有bug)的更多相关文章
- 百度之星 资格赛 1003 度度熊与邪恶大魔王 dp(背包)
度度熊与邪恶大魔王 Accepts: 1141 Submissions: 6840 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 3 ...
- 百度之星资格赛 1003 度度熊与邪恶大魔王(二维dp)
分析 挺好的一道题 dp[i][j]表示打败i颗血j防御力的怪兽需要的最少宝石数 然后就好了,复杂度\(O(n+m*1000*10)\) #include <bits/stdc++.h> ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU - 6113 2017百度之星初赛A 度度熊的01世界
度度熊的01世界 Accepts: 967 Submissions: 3064 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...
- ACM学习历程—BestCoder 2015百度之星资格赛1004 放盘子(策略 && 计算几何)
Problem Description 小度熊喜欢恶作剧.今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子的是获胜者,会赢得失败者的一个吻.玩了两次以后,小度熊发 ...
- HDU 6083 度度熊的午饭时光(01背包+记录路径)
http://acm.hdu.edu.cn/showproblem.php?pid=6083 题意: 思路: 01背包+路径记录. 题目有点坑,我一开始逆序枚举菜品,然后一直WA,可能这样的话路径记录 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- 2016百度之星 资格赛ABCDE
看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...
随机推荐
- insserv: warning: script 'lampp' missing LSB tags and overrides
https://ubuntuforums.org/showthread.php?t=2327011 1.方法一,编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚 ...
- Linux C++的多线程编程(转)
1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...
- LeetCode——Remove Nth Node From End of List
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 在linux中安装.sh 文件
有一些linux的安装包是.sh后缀的安装包,可以通过$bash xxx.sh的命令来进行安装.
- JQuery插件ajaxFileUpload 异步上传文件
一.先对ajaxFileUpload插件的语法参数进行讲解 原理:ajaxfileupload是通过监听iframe的onload方法来实现, 当从服务端处理完成后,就触发iframe的onload事 ...
- wyh2000 and pupil
wyh2000 and pupil Accepts: 93 Submissions: 925 Time Limit: 3000/1500 MS (Java/Others) Memory Lim ...
- 利用python暴力破解ssh
# -*- coding:utf-8 -*- #python 2.7 import optparse,sys,threading import pexpect PROMPT = ['#','>' ...
- 使网页适应UIWebView的宽度
比較简单的做法是:在- (void)webViewDidFinishLoad:这种方法中,改动JavaScript的值: //UIWebViewDelegate - (void)webViewDidF ...
- WPF DataGrid 获取选中 一行 或者 多行
WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作 然而SelectedItem 与SelectedItems DataGrid的SelectionU ...
- java序员必备的十大技能
想成为一名出色的Java程序员么?本文将为大家重点介绍程序员必备的十大技能,成就您的梦想. 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样 ...