Ka的回溯编程练习 Part4|分配工作

设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下。

每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。

这个主要是细节了,没什么难度

 1 #include<stdio.h>
 2 int MansToJobs[6][6]={{0,0,0,0,0,0},{0,13,11,10,4,7},{0,13,10,10,8,5},{0,5,9,7,7,4},{0,15,12,10,11,5},{0,10,11,8,8,4}};
 3 //以上,前一维代表人名,后一维代表工作量
 4 int TheBestResultOfDistribution[6]={0}; //选择时的临时储存
 5 int BossWantIt[6]={0}; //最优解的储存   和上面都是下标代表工作序号,内容代表工作者
 6 int BestRecord=0,NowadayRecord=0;  //工作总量储存:BestRecord是最优解的储存,NowadayRecord是临时储存
 7 int search(int n)    //第几个人
 8 {
 9     int i,j;
10     for(i=1;i<=5;i++) //第几个工作
11     {
12         if(TheBestResultOfDistribution[i]==0) //如果此工作没人干
13         {
14             TheBestResultOfDistribution[i]=n; //交给此人
15             NowadayRecord+=MansToJobs[n][i]; //记录工作总情况
16             if(n==5)   //如果已经有了5个选择
17             {
18                 if(NowadayRecord>BestRecord)   //又如果这一次的总工作量大于上一次记录的最多的
19                 {
20                     BestRecord=NowadayRecord; //替代一下
21                     for(j=1;j<=5;j++)
22                         BossWantIt[j]=TheBestResultOfDistribution[j];
23                 }
24             }
25             else search(n+1);
26             TheBestResultOfDistribution[i]=0; //恢复现场,这一步别的框架可能不需要,但这个需要
27             NowadayRecord-=MansToJobs[n][i];
28         }
29     }
30
31 }
32 int main()
33 {
34     int i;
35     search(1);
36     for(i=1;i<=5;i++) //输出没什么好说的了
37         printf("The job:%d give the guy:%d\n",i,BossWantIt[i]);
38     printf("total:%d",BestRecord);
39     return 0;
40 }
时间: 2024-07-29 09:16:24

Ka的回溯编程练习 Part4|分配工作的相关文章

Ka的回溯编程练习 Part6.5|详解|有重复元素的排列问题

#include <stdio.h> #define br printf("\n"); int ans=0; char el[502]; int confirm(int i,int k) //往回比较,如果元素有相同跳过此情况 { if(i>k) { while(i>k) { if(el[i]==el[k]) return 0; k++; } } return 1; } void op(int n) { ans++; int j; for(j=0;j<=n

Ka的回溯编程练习 Part2|八皇后问题

1 #include <stdio.h> 2 int AChessBlockRecorder[10]={0}/*下标层数,内容竖行*/,ThisIsMyPlace[10]={0};/*占领*/ 3 int TheTalentOfTheQueen1[25]={0}; //前一个维度代表主对角线特性,相减同 4 int TheTalentOfTheQueen2[25]={0}; 5 int total=0; 6 void output() 7 { 8 total++; 9 printf("

Ka的回溯编程练习 Part3|马的遍历

1 #include <stdio.h> 2 int board[100][3]={0},totally=0; 3 int x[4]={2,1,-1,-2},y[4]={1,2,2,1}; 4 void o(int k) //这个输出函数需要借助回溯中n的值来完成输出 5 { 6 totally++; 7 printf("%d:",totally); 8 int r; 9 for(r=1;r<=k-1;r++) 10 printf("|%d,%d|->

Ka的回溯编程练习 Part6|有重复元素的排列问题

第一个问题: 有红球4个,白球3个,黄球3个,将它们排成一排共有多少种排法 #include <stdio.h> int BallsIUsed[201]; int BallsIHave[201]={0}; int total=0; int k; void op() { int i; total++; printf("%d:",total); for(i=1;i<=k;i++) { printf("%c",BallsIUsed[i]); } prin

Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s==0) return; 5 hanoi(s-1,a,c,b); //把最底下的从a借助c移动到b 6 printf("s from %c move to %c\n",a,c); 7 hanoi(s-1,b,a,c); //把刚才弄到b的借助a叠到c上 8 } 9 int main() 10

Ka的回溯编程练习 Part5|跳马,又名马的遍历2

1 #include <stdio.h> 2 int TheEarthLand[6][6]={0}; 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1}; 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2}; 5 int total=0; 6 void op() 7 { 8 total++; 9 printf("<Way%d>:\n",total); 10 int i,j; 11 for(i=1;i&l

分配工作时需要考虑的问题

文章试图总结作为一个技术管理者给下属进行工作分配时,需要从哪些方面考虑,以及需要注意的问题.实际上,也可以作为一个下属如何完成上级分配工作的一个指引.就像文章里说到的,我们在分配给别人任务的时候,别人也在分配任务给我们.我们在别人身上寻找某种特质的时候,别人也在我们身上寻找类似的东西. 一般情况下,管理者都会将工作安排给自己信任的人,因为对他的工作能力和工作态度都比较熟悉,能预估到他的工作情况,不会出现太大的意外,有更大的掌控,所以才偏向于自己熟悉的人. 那面对还没有建立起信任关系的人,应该如何

Ka的递归编程练习 Part8|回溯之二 排列组合

1 #include <stdio.h> 2 int resl[1000]={0},used[1000]={0}; 3 int n,r; 4 int tot=0; 5 void output() 6 { 7 tot++; 8 printf("<%d>:",tot); 9 int i; 10 for(i=1;i<=r;i++) 11 printf("%d ",resl[i]); 12 printf("\n"); 13

员工分配工作(深度优先)

题意:公司分配N项工作给N个员工,每个员工只能被分给1项工作,每个人处理工作的时间不同.求完成所有工作所需的最少时间. 输入:第一行输入整数N,代表N个员工,员工编号从1到N(1<=N<=10)   接下来输入一个N*N的二维矩阵task[N][N],其中task[i][j](0<=task[i][j]<=1000)代表第i项工作由j号员工完成所需的时间. 输出:输出一个整数,代表工作完成所有工作所需的最少时间. 样例: 输入: 610 11 12 11 9 1111 9 10 1