【题意】 一群人 去n个城市旅游 每个城市有一个消费cost,每个人的cost 都相同。每个人i对城市j都有一个喜爱的值inter[i][j]。他们的路线及起点终点都已经确定。每一个人都有权中途离开队伍,或者干脆第一座城市就不去,但是一旦离开就不可以再回来. 一群人呆在一起 兴趣可以增加 增加的值为 两两的b值之和。 求可以获得的(inter-cost) 的最大值 若其不大于0 就输出 stay home
【思路】 二进制state 第i位为1 代表第i个人在队伍里 ,到第i个城市的时候 队伍里的人的状态为state
dp[i][state]= max(dp[i-1][j]+sum(i,state)); ( ( state&j)==state ) // 在第i-1 个城市时 状态为j 即state 里的人都在 没在state 里的人也可能在
1 #include2 #include 3 #include 4 #include 5 #include 6 7 #define maxx 1<<11 8 using namespace std; 9 int m,n,dp[11][maxx],inter[11][11],b[11][11],cost[11];10 bool vis[11];11 12 int sum(int k,int state)// 第k座城市 状态为state时13 {14 memset(vis,false,sizeof(vis));15 for(int i=0;i ans)62 ans=dp[m-1][i];63 return ans;64 }65 66 67 int main()68 {69 while(~scanf("%d%d",&n,&m))70 {71 if(n==0&&m==0)72 break;73 for(int i=0;i 0)84 printf("%d\n",p);85 else printf("STAY HOME\n");86 }87 return 0;88 }