uva10817

来源:互联网 发布:2016淘宝开店认证步骤 编辑:程序博客网 时间:2024/06/11 02:28


此题是位运算的dp 有点类似0-1背包 因为思路就是m名求职者取还是不取 取就是1,不取就是0;


然后dp【i】【j】 代表所有课程被选第一次的i状态 和被选第二次的j状态。那么我最后只要输出dp【1<<S-1】【1<<S-1】的状态中的值就可以了。

然后dp【i】【j】的转移方程就是在加入第i个求职者后的状态,与不加第i个求职者状态的比较

ts1=j|state[i];//第一次状态已经拥有的课程在第i次状态下已经有了一次才能允许该老师教该课程第二次(因为限定每门课程两名老师教)ts2=(j&state[i])|k;dp[ts1][ts2]=min(dp[ts1][ts2],dp[j][k]+cost[i]);
其中j状态来模拟第一次的上课,k状态模拟第二次的上课,加入第i个求职者状态后的情况做比较就可以了。

此题巨坑爹的是输入。但是也多亏此题让我熟悉sscanf  gets  isdigit 三个的用法。输入的调试就搞来我好久。。。唉。。。


弱弱的补一句 貌似网上的做法是,d[i][j]表示在前i个人中聘用某些人达到状态j所需的最小花费 我没看他们的代码,不知道和我的是不是差不多。但是我试着交了一下我的貌似快那么一点点。可能是服务器的原因。也有可能是别人思路和我差不多只是我没看代码只是看了那一句话。

原创粉丝点击