33,008
社区成员
发帖
与我相关
我的任务
分享
#include <cstdio>
#include <cstring>
using namespace std;
//定义输入数据的最大个数
#define MAX_NUMBER 20
//定义查找数据的最大值
#define MAX_VALUE 2000
int number[MAX_NUMBER];
int ans[MAX_VALUE + 1];
int next[MAX_VALUE + 1];
//数据个数与要查找的值
int n, value;
int main() {
printf("输入数据个数:");
scanf("%d", &n);
printf("输入各个数字:");
for(int i = 0; i < n; ++i) {
scanf("%d", &number[i]);
}
printf("输入要组合的数:");
scanf("%d", &value);
memset(ans, 0, sizeof(ans));
memset(next, -1, sizeof(next));
next[0] = 0;
ans[0] = 1;
for(int i = 0; i < n; ++i) {
for(int j = value - number[i]; j >= 0; --j) {
if(ans[j + number[i]] == 0 && ans[j] == 1) {
ans[j + number[i]] = 1;
next[j + number[i]] = j;
}
}
}
if(ans[value] == 0) {
printf("不存在这样的子集!");
} else {
printf("子集中的数为:");
for(int j = value; j > 0; ) {
printf("%d,", j - next[j]);
j = next[j];
}
}
return 0;
}