回 帖 发 新 帖 刷新版面

主题:求教:幫帮小弟吧,C的程序改成C#(急救啊!在线等!)

求求各为高手了。帮帮小弟的忙吧!!!
 
 求工作天數的問題,5項工作分配給5個人,求出有多少個分配組合
並求出最快的組合。
A B C D E
工作1 {10, 5, 7, 12, 8},
工作2 {14, 20, 15, 10, 15},
工作3 {18, 30, 20, 25, 22},
工作4 {35, 8, 18, 20, 12},
工作5 {20, 13, 8, 10, 17},

[color=800000]以下是C代碼:[/color]
#include <stdio.h>

#define JOB (5)
#define PERSON (5)
#define DEFAULTMIN (35*PERSON)
int
       table[JOB][PERSON]={
              {10,  5,  7, 12,  8},
              {14, 20, 15, 10, 15},
              {18, 30, 20, 25, 22},
              {35,  8, 18, 20, 12},
              {20, 13,  8, 10, 17},
       };

static int nextplaces(int *place, int len, int max){
       //add most left place
       int
              i,
              flags;
       
       //loop while "place" is containg the same number in.
       for(;;){
              //next "place"
              for(i=0;i<len;i++){
                     if((place[ i ]=(place[ i ]+1)%max)!=0)
                            break;
              }
              
              //if place is maximum number((max-1)^len), then it returns 1;
              if(i==len)
                     return 1;
              else{
                     //else check "place" hasn't a same number in.
                     for(i=flags=0;i<len;i++){
                            if(flags & (2<<place[ i ])){
                                   flags=0;
                                   break;
                            }else
                                   flags|=2<<place[ i ];
                     }
                     if(flags)
                            return 0;
              }
       }
}

int main(void){
       int
              person,
              job,
              min,
              place[PERSON], mem[PERSON];
       
       //clear "place"
       for(job=0;job<JOB;place[job++]=0);
       
       //compute minimum number
       min=DEFAULTMIN;
       for(;!nextplaces(place, PERSON, JOB);){
              int sum;
              sum=0;
              //get sum
              for(person=0;person<PERSON;person++)
                     sum+=table[place[person]][person];
              
              //compare
              if(min>sum){
                     //replace place
                     for(person=0;person<PERSON;person++)
                            mem[person]=place[person];
                     min=sum;
              }
       }
       
       //outputs
       printf("minimum is %d   n", min);
       for(person=0;person<PERSON;person++)
              printf("person%d does job%d(cost %d)   n", person, mem[person], table[mem[person]][person]);
       
}

回复列表 (共4个回复)

沙发

题目可能是不清楚。
       王  张 李 赵    刘
工作1 {10, 5, 7, 12,   8},
工作2 {14, 20, 15, 10, 15},
工作3 {18, 30, 20, 25, 22},
工作4 {35, 8,  18, 20, 12},
工作5 {20, 13,  8,10, 17},

数值是代表每人所需的工作天数。

谢谢

板凳

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
      static void Main(string[] args)
        {
         int[] a = new int[5] { 10, 5, 7, 12, 8 };
         int[] b = new int[5] { 14, 20, 15, 10, 15 };
         int[] c = new int[5] { 18, 30, 20, 25, 22 };
         int[] d = new int[5] { 35, 8, 18, 20, 12 };
         int[] e = new int[5] { 20, 13, 8, 10, 17 };
         int[] result=new int[120];
         int num = 0;
         for (int i = 0; i < 5; i++)
         {
             for (int j = 0; j < 5; j++)
             {
                 if (j == i)
                     continue;
                 else
                 {
                     for (int k = 0; k < 5; k++)
                     {
                         if (k == j || k == i)
                             continue;
                         else
                         {
                             for (int l = 0; l < 5; l++)
                             {
                                 if (l == k || l == j || l == i)
                                     continue;
                                 else
                                 {
                                     for (int m = 0; m < 5; m++)
                                     {
                                         if (m == l || m == k || m == j || m == i)
                                             continue;
                                         else
                                         {
                                            int  sums =a[i]+b[j]+c[k]+d[l]+ e[m];
                                             result[num] = sums;
                                             num++;
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }

3 楼

//贴子太长,做两个发,直接复制到上贴后面即可。
        int min; min = result[0];
         for (int x = 0; x < 120; x++)
         {
             if (result[x] < min)
             {
                 min = result[x];
                 continue;
             }
             Console.WriteLine("The all is:{0}", result[x]); //列出所有可能值
         }
           Console.WriteLine("The fastest is:{0}",min);  //列出最快值
           Console.WriteLine("The num is:{0}", num);  //列出所有个数
           Console.ReadKey();
        }
  }
}

4 楼

非常感谢!谢谢,谢谢。

我来回复

您尚未登录,请登录后再回复。点此登录或注册