任务安排(搜索)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务安排(搜索)相关的知识,希望对你有一定的参考价值。

给定N(<=30)个人和N台机器,以及每个人操作某台机器的收益。请计算所有人都工作的情况下,最大的收益和。
输入:
第一行两个数分别表示人和机器的数量(两数相等)
接下来若干行,每行三个数,a,b,c表示a 操作机器b的收益为c.
输出:
两个数。(第一个数表示参加工作的人数(此数为N),第二个数表示最大收益和。)
样例:
输入:
3 3
1 2 10
1 1 9
1 3 3
2 1 10
2 2 9
2 3 3
3 1 8
3 2 9
3 3 8
输出:
3 28

简单搜索,暴力剪枝。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std ;
 7 
 8 int cnt, jv[31][31][2], sum[31], ans ;  
 9 bool used[31] ; 
10 struct id { int sze, chu ; }; id lie[31] ;
11 
12 int cmp ( id a, id b ) {
13     return  a.chu < b.chu ;
14 }
15 
16 
17 void dfs ( int sze, int jia ) {
18     if( sze> cnt ) {
19         if(ans < jia ) ans = jia ;
20         return ;
21     }
22     int now = lie[sze].sze ;
23     
24     if( sum[cnt] - sum[sze-1] + jia <= ans ) return ;
25     for(int x = jv[now][0][0]; x>=1; x--) {
26         int to = jv[now][x][0] ;
27         if( used[to] ) continue ;    
28         used[to] = 1 ;
29         dfs( sze+1, jia+jv[now][x][1] ) ;
30         used[to] = 0;
31     }
32     return ;
33 }
34 
35 
36 
37 int main ( ) {
38 //    freopen( "1.txt", "r", stdin ) ;
39     scanf( "%d", &cnt ) ; scanf( "%d", &cnt ) ;
40     int a, b, c;
41     int n[31] ; memset( n, 0, sizeof(n) ) ;
42     while( cin>>a>>b>>c ) {
43         jv[a][ ++jv[a][0][0] ][0] = b ; 
44         jv[a][ jv[a][0][0] ][1] = c ;
45         n[a] = max( n[a], c ) ;
46     }
47     for(int x = 1; x <= cnt; x++) {
48         lie[x].chu = jv[x][0][0] ;
49         lie[x].sze = x ;
50     }
51     sort(lie+1, lie+1+cnt, cmp) ;
52         
53     for( int x = 1; x <= cnt; x++) {
54         int now = lie[x].sze ;
55         sum[x] = sum[x-1] + n[now] ;    
56     }
57     dfs( 1, 0 ) ;
58     printf( "%d %d\n", cnt, ans) ;
59 }

 

以上是关于任务安排(搜索)的主要内容,如果未能解决你的问题,请参考以下文章

屏幕方向期间片段内的异步任务

以编程方式安排解析后台作业

Fragment 中的计划任务将 getActivity 返回为 null

敏捷冲刺四

敏捷冲刺二

敏捷冲刺三