拔河比赛 规矩把全部人分红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; }