#include <stdio.h>
#include <stdlib.h>
int *data;
int *result;
int sum;
int n,c;
int cut;//
int main(int argc, char *argv[]) {
scanf("%d %d",&n,&c);
data = malloc(sizeof(int)*(n+1));//源数据
result = malloc(sizeof(int)*(n+1));//结果数组
sum = 0;//子集和
int i;
for (i=1; i<=n; i++) {
scanf("%d",data+i);
cut += data[i];//初始值为元素之和
result[i] = 0;
}
backTrack(1);
for (i=1; i<=n; i++) {
if(result[i]) {
printf("%d ",data[i]);
}
}
return 0;
}
int backTrack(int i) {
if(sum == c) {
return 1;
}
if (i > n) {
return 0;
}
cut -= data[i];
if (sum + data[i] <= c) {
result[i] = 1;//1表示选择该数到子集
sum += data[i];
if (backTrack(i+1)) {
return 1;
}
sum -= data[i];//没有return出去,从该节点回溯,减去该节点
}
if (sum + cut >= c) {
result[i] = 0;
if (backTrack(i+1)) {
return 1;
}
}
cut += data[i];
return 0;
}
子集和问题
最新推荐文章于 2020-10-28 17:18:25 发布