拔河比賽---C語言代碼,編譯器Xcode

拔河比賽 規矩把全部人分紅A B兩隊,力氣大的一方勝出 因爲一開始不知道每一個人力量多大,因此主持人分組定下以下策略: 根據每一個人的體重儘量的分配平均 分配的策略是:數組

  1. A B兩隊人數相差 <= 1
  2. A B兩隊人總量之差絕對值最小

=======================================================函數

好比某班級有N(可爲奇數或者偶數)我的, 編號爲0, 1, 2, ... (N-1) 每一個人都有自身的體重, 好比 W0, W1, W2, ... W(N-1) 請問如何分配比賽兩隊的人數,保證雙方人體重總和相差最小 打印出 A B兩隊的整體重(從小到大)設計

好比: 有7我的, 體重分別爲 100 90 200 220 130 120 110code

輸出爲(先輸出體重小的兩邊總和): 470 500 請設計一個程序,根據人數自動來進行統計 注意輸入的時候 第一個是輸入的人個數,好比7我的後續輸入的是7我的的體重遞歸

==================================================================圖片

思路:it

1.這是個什麼問題io

問題描述的最小值循環

2.個人思路 把全部的可能都列出來,和全部人體重的一半相比,差絕對值最小的就是所要求的。float

3如何實現個人思路

遞歸:n個裏面選n (原始狀態)<- (n + 1)個裏面選n

如何實現n+1 ->n 取n+1數組中的前n個,而後最後一個和前面的元素進行交換,

交換方式:以下 1234 5

5234 1

5134 2

5124 3

5123 4

總思路實現如 1234(整體重一半就是5) 12(絕對值差2) 34

32(絕對值差0) 14-->這裏能夠設置break 直接跳出循環

31(絕對值差1) 24

41(絕對值差0) 23

42(絕對值差1)13

43(絕對值差2)12

========================================================== 實現代碼以下:

#include <stdio.h>
#include <math.h>
void exch(int *a,int i,int j)
{//交換函數
    int temp;
    temp = a[i];a[i] = a[j];a[j] = temp;
}

float f1(int*a,int len,int i,float wei)
{//遞歸函數
    int ii;
    int jj;
    float n;
    float min = 11111;
    int sum = 0;
    if (i == len/2-1+len%2) {
        for (ii = 0; ii <= i; ii++) {
            sum+=a[ii];}
        n = sum-wei;
        // printf("n%f\n",n); 中間過程監視
        if (n < 0) {
            n = -1*n;}
        if (n < min) {
            min = n;
        }
        return n;
    }
    else{
        for (ii = i; ii < len; ii++) {
            for (jj = 0; jj < ii; jj++) {
                n = f1(a, len, i-1, wei);
                if (n < min) {
                    min = n;}
                exch(a, ii, jj);
            }
        }
    }
    return min;
}

//主函數
int main(int argc, const char * argv[]) {
    int count;
    int i;
    float n,min =9999;
     printf("請輸入人數");
    scanf("%d",&count);//得到人數
    int a[count];//用count 省點空間
    int weicount = 0;
    for (i = 0; i < count; i++) {
        scanf("%d",&a[i]);//逐個賦值
        weicount += a[i];
    }
    float w = weicount/2.0;
    for (i = count/2-1+count%2; i < count; i++) {
        n = f1(a,count,i,w);
//        printf("%.1f\n",n);
        if (n < min) {
            min = n;
        }
        if (n == 0) {
            break;
        }
    }
//     printf("一半重量%f\n",w);
//     printf("最優組合重量%f",w-min);
    int bb = w-min;
    
//    按照題目要求輸出
    printf("%d %d",bb,weicount-bb);
    return 0;
}
相關文章
相關標籤/搜索