hdu1074Doing Homework【状态压缩】

Problem Description
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score of the final test, 1 day for 1 point. And as you know, doing homework always takes a long time. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.
 

Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case start with a positive integer N(1<=N<=15) which indicate the number of homework. Then N lines follow. Each line contains a string S(the subject's name, each string will at most has 100 characters) and two integers D(the deadline of the subject), C(how many days will it take Ignatius to finish this subject's homework).

Note: All the subject names are given in the alphabet increasing order. So you may process the problem much easier.
 

Output
For each test case, you should output the smallest total reduced score, then give out the order of the subjects, one subject in a line. If there are more than one orders, you should output the alphabet smallest one.
 

Sample Input
   
   
   
   
2 3 Computer 3 3 English 20 1 Math 3 2 3 Computer 3 3 English 6 3 Math 6 3
 

Sample Output
   
   
   
   
2 Computer Math English 3 Computer English Math
Hint
In the second test case, both Computer->English->Math and Computer->Math->English leads to reduce 3 points, but the word "English" appears earlier than the word "Math", so we choose the first order. That is so-called alphabet order.

又是一个拖了两天才写完的题,昨天下午整个状态就不好,主要就是中午没睡好==(其实是生态学睡多了),晚上这个题也没看进去T^T

题意:做作业,在规定时间内没写完拖一天扣一分,问最少扣几分,并且要求输出顺序,难为死本宝宝了,输出的还得是按字典序来的,冥思苦想百思不得其解,能想到用二进制表示状态,毕竟是状压的题,但是顺出顺序怎么搞?_(:зゝ∠)_ 别忘了,第一重循环是状态的枚举,第二重就是n个学科的枚举了呀,枚举之后替换意味着什么?意味着把相对优秀的解加入到了待输出的序列中,所以啊,每替换一个就用下标为当前状态的记录当前的学科,我们都知道状态的那个二进制每位也是学科的0/1序列,所以说当前状态中除去那个学科就是前一状态,就可以用递归表示输出了:-D 而且根据上一句话,我们可以知道,既然是要把新替换的加到最后,那么应该让新加入的是字典序大的。所以我觉得如果二进制递归输出的顺序改变,枚举学科的方向也会改变

/***********
hdu1074
2016.1.6-1.7
0MS 1964K 1162 B G++
***********/
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,dead[20],cost[20],dp[1<<16],def[1<<16],time[1<<16];
char name[20][120];
void print(int num)
{
    if(!num) return;
    print(num-(1<<def[num]));
    printf("%s\n",name[def[num]]);
}
int main()
{
    //freopen("cin.txt","r",stdin);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++) scanf("%s%d%d",&name[i],&dead[i],&cost[i]);
        for(int i=1;i<(1<<n);i++)
        {
            dp[i]=0x3f3f3f3f;
            for(int j=n-1;j>=0;j--)//里面有j 由i推导出之前没有j的状态
            {
                int tmp=1<<j;
                if(!(i&tmp)) continue;
                int val=time[i-tmp]+cost[j]-dead[j];
                if(val<0) val=0;
                if(dp[i]>dp[i-tmp]+val)
                {
                    dp[i]=dp[i-tmp]+val;
                    time[i]=time[i-tmp]+cost[j];
                    def[i]=j;
                }
            }
        }
        printf("%d\n",dp[(1<<n)-1]);///
        print((1<<n)-1);
    }
    return 0;
}

p.s.好久没在CSDN上写乱七八糟的了,也算是有感而发,昨天晚上回寝室上电梯的时候(大概10点20)遇到一个12级的学姐,打招呼问我从图书馆回来的?答是。复习考试去了?答是。现在实在是懒得跟别人解释自己是搞ACM的所以从成栋楼回来,周二那天下午考完遥感去和另一个学姐看电影,一路上尴尬的要死,要不是她执意要请回来这次,我是万万不会和自己感觉不太熟的人出去的,根本不知道要说什么,也不知道回答什么,这架势下去明年,不, 是今年找工作的时候就不要吹嘘自己三年社团沟通能力强吧。重点是最后分开始的时候我说我去成栋楼,问我去成栋楼干嘛,我说信息院搬去成栋楼了,对方又疑惑,我说我搞这个的,啊,对方表示记得c++老师说过,还总吹实验室的人都多么厉害,其实一方面是扩大招生,另一方面也有值得他自豪的原因吧。但是我实在是懒得跟所有人解释我天天都干嘛,昨天晚上看一个状态说社交恐惧症的典型表现,我几乎都符合,就像某人说的,编程是一个孤独的行业(其实后面还有一句:你现在根本静不下来,以后也静不下来。为啥我能记得这么清楚)差半个月就一年了,真是改变挺多的。就算是没有编程也应该找点什么事情能让自己静下来的,我觉得这也是当代大学生所缺乏的。

再说几个关于扣扣空间和微信链接的,早上刷空间,一个学妹转发了微博上的关于女大学生跳楼的评论文章,文章说不管这个女生到底因为什么而死,吸引人眼球的却只是她同时和两个男生开房,而围观的人只是津津乐道于所谓的不守妇道。这位学妹说“又一个女孩死了。在中国,女孩难将养。我很灰心,很难过,很沮丧也很害怕。我只想问问,中国的女人做了什么灭绝人性的事而遭到法律和社会这样的对待。请你告诉我,无论什么理由,我都接受。起码身处于血泊之中,让我看到一点希望的光。”,又联想到之前每次临近考试就在空间里发赠我一只xx大神吧,尤其是大一上学期居然在空间里说“哪位大神教我一下反码补码”自从自己的自学能力增强,愈发看不起那些依赖性特别强的人,却说我也是那么过来的,但是明明在百度首页就能找到的答案为什么就是不去找反而大言不惭的麻烦别人??更何况又不是老师没教过,自己不学习在空间装什么学霸,不自立凭什么然别人看的起?每天娇滴滴的活着,凡事就等着别人做,且不说自己前途未来,只是享受着社会对于女性的关照,你也活该接受社会对于女性的偏见。

微信链接一:文中想表达的意思是同事有一个看似很热心的大姐,虽是热心,但也热衷于传递自己道听途说以及自己猜想的的各家八卦,作者说自己请几天假就被认为是去买房了,就是因为这人从她朋友圈的几天含糊其辞的状态中判断的。作者告诉我们不要相信这些流言,因为都不是真的。可是我想说,你要不是有点破事非得发朋友圈别人能误会你吗?而且说话不会正常说,非得含糊其辞的,不就是擎等着别人猜吗?别人不猜你觉得别人不关心你,别人猜了还非得猜对才行,你以为谁啊。
微信链接二:作者是女性,父辈这边四个孩子,自己父亲是最能挣钱的,可惜家里重男轻女,四叔觉得自己家是男孩家族的钱都得给自己儿子花,不应该供作者出国念书,毕竟最终嫁人,而自己儿子是家里的独苗,就算是二表都考不上也得供着。彼此看不惯对方的价值观,最终在过年的时候打起来了,四叔进了派出所,奶奶心脏病突发没抢救过来。虚构的比例大于百分之九十,倒不是我饱汉不知饿汉饥,实在是受够了这些耸人听闻、博人同情的故事==苦心孤诣的营造出一种悲凉的气息也是醉了
吐槽完毕,也就是CSDN上敢这么大放厥词了,我感觉我已逐渐丧失和正常人沟通的能力了

你可能感兴趣的:(dp,二进制)