首页 > 代码库 > 任务安排(搜索)

任务安排(搜索)

给定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 }

 

任务安排(搜索)