这是题目要求:
令 S 为一个 n 个正整数的集合,n 为偶数。请设计一个有效算法将 S 分成两个子集 S1 和 S2,使每个子集中含有 n/2 个元素,而且 S1中所有元素的和与 S2中所有元素的和的差最大
输入:
2
22
68 25 34 16 2 37 3 95 76 57 21 13 4 78 29 6 17 39 51 20 43 12
26
28 3 48 59 14 32 47 51 42 61 9 24 52 78 65 2 37 78 51 73 29 7 26 95 37 2
输出:
2 3 4 6 12 13 16 17 20 21 25
29 34 37 39 43 51 57 68 76 78 95
2 2 3 7 9 14 24 26 28 29 32 37 37
42 47 48 51 51 52 59 61 62 65 73 78 95
这是我的代码:
```c
#include
int main(){
int m=0;
scanf("%d\n",&m);
while(m>0){
int n,i,j,t=0;
scanf("%d\n",&n);
int a[n];
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n-1;i++){
for(j=1;j<=n-i;j++){
if(a[j+1]t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=1;i<=n/2;i++){
printf("%d ",a[i]);
}
printf("\n");
for(i=n/2+1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("\n");
m--;
}
}
我的想法是对每组的数据进行排序,然后由中间分开成前后两个小子集就行了,但是不能按题目要求一次性输入多组数据然后依次输出结果
该回答引用ChatGPT
您的代码已经实现了将每组数据排序,并将其分成前后两个小子集的功能。但是,如果需要按题目要求一次性输入多组数据,并依次输出结果,可以使用一个循环来实现,例如:
#include <stdio.h>
int main() {
int m;
scanf("%d", &m); // 输入数据组数
while (m--) {
int n, i, j, t;
scanf("%d", &n); // 输入本组数据的元素个数
int a[n];
for (i = 0; i < n; i++) {
scanf("%d", &a[i]); // 输入本组数据
}
// 对本组数据进行排序
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (a[j + 1] < a[j]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
// 将本组数据分成前后两个子集并输出
for (i = 0; i < n / 2; i++) {
printf("%d ", a[i]);
}
printf("\n");
for (i = n / 2; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n\n");
}
return 0;
}