首页 > 代码库 > 任务安排(搜索)
任务安排(搜索)
给定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 }
任务安排(搜索)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。