题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4281

题意:给出N个点,第一个点是裁判,其他N-1个点需要裁判过去回答问题,每个点需要的时间不一样,而每个裁判最多能回答M分钟的问题。题目分两问,第一问是如何分配可以使使用的裁判数最少,第二问是如何分配裁判,使裁判走过的总路程和最少,裁判一开始都在1,最终也要回到1。

思路:首先我们可以把符合条件的集合预处理出来,然后对于第一问,可以用状态压缩解决,dp[state]表示该状态下的最少裁判数,对于第二问,就是多旅行商问题了,dp[i][j]表示状态为i,在位置j的最小花费,然后开一个best数组来保存最有状态,最后枚举子集,DP合并环即可。比如1~3三个点,裁判在1,那答案就是Min(1->2->3->1,1->2->1 + 1->3->1)。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define inf 1<<30 struct Point{
int x,y;
}point[]; int n,m,ans,val[],dp1[<<];
int dp[<<][],best[<<];
int Ok[<<];
int dist[][]; int Get_Dist(int i,int j)
{
return ceil(sqrt(double(point[i].x-point[j].x)*(point[i].x-point[j].x)+double(point[i].y-point[j].y)*(point[i].y-point[j].y)));
} int Judge(int state)
{
int sum=;
for(int i=;i<n;i++){
if(state&(<<i))sum+=val[i];
}
return sum<=m;
} int Solve()
{
fill(dp1,dp1+(<<n),inf);
dp1[]=;
for(int state=;state<(<<n);state++){
if(Ok[state]){
for(int i=;i<(<<n);i++){
if((state&i)==&&dp1[i]!=inf){
dp1[state|i]=min(dp1[state|i],dp1[i]+);
}
}
}
}
return dp1[(<<n)-];
} int TSP()
{
fill(best,best+(<<n),inf);
for(int i=;i<(<<n);i++)
for(int j=;j<n;j++)dp[i][j]=inf;
dp[][]=;
for(int state=;state<(<<n);state++){
if(Ok[state]){
for(int i=;i<n;i++)if(state&(<<i)){
if(dp[state][i]==inf)continue;
best[state]=min(best[state],dp[state][i]+dist[i][]);
for(int j=;j<n;j++)if(!(state&(<<j))){
dp[state|(<<j)][j]=min(dp[state|(<<j)][j],dp[state][i]+dist[i][j]);
}
}
}
}
for(int state=;state<(<<n);state++){
if(state&){
for(int substate=state&(state-);substate;substate=state&(substate-)){
best[state]=min(best[state],best[substate]+best[(state^substate)|]);
}
}
}
return best[(<<n)-];
} int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=;i<n;i++)scanf("%d%d",&point[i].x,&point[i].y);
for(int i=;i<n;i++)scanf("%d",&val[i]);
for(int i=;i<n;i++)
for(int j=;j<n;j++)dist[i][j]=Get_Dist(i,j);
for(int s=;s<(<<n);s++){
Ok[s]=Judge(s);
}
ans=Solve();
if(ans==inf){
puts("-1 -1");
continue;
}
printf("%d %d\n",ans,TSP());
}
return ;
}

hdu 4281(MTSP)的更多相关文章

  1. HDU 4281 (状态压缩+背包+MTSP)

    Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDU 4281 Judges' response 状压dp+多旅行商问题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4281 Judges' response Time Limit: 2000/1000 MS (Java ...

  3. hdu 4281 Judges' response(多旅行商&DP)

    Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. DP专题·三(01背包+完全背包)

    1.hdu 2126 Buy the souvenirs 题意:给出若干个纪念品的价格,求在能购买的纪念品的数目最大的情况下的购买方案. 思路:01背包+记录方案. #include<iostr ...

  5. [GodLove]Wine93 Tarining Round #8

    比赛链接: http://vjudge.net/contest/view.action?cid=47644#overview 比赛来源: 2012 ACM/ICPC Asia Regional Tia ...

  6. 【转载】ACM总结——dp专辑

    感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一 ...

  7. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

  8. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

  9. 【DP专辑】ACM动态规划总结(转)

    http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...

随机推荐

  1. 【leetcode】Convert Sorted Array to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  2. We7 CMS研究

    我下载的we7 3.0是基于vs 2010的,官方网站也建议使用vs2010,但是我有追新的习惯,并相信vs 2013一定能够兼容vs2010的项目,于是在vs2013下打开解决方案并且全部升级,把目 ...

  3. 没有body怎么添加onload事件

    <script type="text/javascript"> window.onload = function () { setup(); } </script ...

  4. bootstrap-datepicker的使用

    转载自:http://michael-roshen.iteye.com/blog/1779541 在普通的网页中显示datepicker比较简单,将bootstrap-datepicker-zh_CN ...

  5. 安装Odoo9出现的could not execute command "lessc"问题

    解决方案: apt-get install node-less

  6. win7画板橡皮擦改变大小

    按住CTRL键不放,再按小键盘上的“+”号键,可以将橡皮擦放大

  7. Linux定时任务设定

    使用crontab 命令进行设定. 详情可参见:http://blog.csdn.net/xiyuan1999/article/details/8160977. 共有6项构成,前5项为时间:分 时 天 ...

  8. java链式编程设计

    一般情况下,对一个类的实例和操作,是采用这种方法进行的: Channel channel = new Channel(); channel.queueDeclare(QUEUE_NAME, true, ...

  9. JS ——window.onload与$(document).ready()

    我们常常在页面加载完成以后做一些操作,比如一些元素的显示与隐藏.一些动画效果.我们通常有两种方法来完成这个事情,一个就是window.onload事件,另一个就是JQuery的ready()方法.那么 ...

  10. Loadrunner11.0 录制手机App脚本的方法

    使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...