核心思路:把木棍两两结合 每结合一次就少一个木棍,每次达到想要的数目,就判断最长木棍和最短木棍的的大小;
递归思路:遍历所有的木棍 将木棍调用递归方法; 遍历余下木棍 将木棍与上层遍历出的木棍结合且把最后的木棍与本次找出的木棍交换位置数组的size--,继续递归
如不太清楚可注意关键位置的注释
#include<iostream>
#include<stdlib.h>
using namespace std;
int minNum = 1000000007;
typedef struct zhan {
int data[10];
int index;
} *ZHAN;
ZHAN init() {
ZHAN p = (ZHAN) malloc(sizeof(zhan));
p->index = 0;
return p;
}
ZHAN copy(ZHAN p) {
ZHAN q = init();
for (int i = 0; i < p->index; i++) {
q->data[q->index++] = p->data[i];
}
return q;
}
int selectnum(ZHAN q) {
int MAX = q->data[0], MIN = q->data[0];
for (int i = 0; i < q->index; i++) {
MAX = MAX > q->data[i] ? MAX : q->data[i];
MIN = MIN < q->data[i] ? MIN : q->data[i];
}
return MAX - MIN;
}
void func(int index, ZHAN p, int size, int n) {
if (size == n) {/*木棍数目达到要求 判断是否最小*/
int temp = selectnum(p);
minNum = minNum < temp ? minNum : temp;
return;
}
for (int i = index + 1; i < size; i++) {
ZHAN q = copy(p);
q->data[index] += q->data[i];/*把上层选出的木棍和本层选出的木棍相加*/
q->data[i]=q->data[q->index-1];/*把本层选出的木棍和最后的木棍互换*/
q->index--;/*size-- 达到剔除已经结合的木棍*/
for (int j = 0; j < q->index; j++) {/*继续遍历当前的木棍*/
func(j, q, q->index, n);
}
}
}
int main() {
int m, n;
cin >> m >> n;
ZHAN p = init();
for (int i = 0; i < m; i++) {
cin >> p->data[p->index++];
}
for (int i = 0; i < m; i++) {
func(i, p, m, n);
}
cout << minNum << endl;
return 0;
}
如有疑问或高见 皆可提出! 有空一 一答复;