【问题描述】
对于一个给定正整数的集合s={x1,x2,x3…xn}和正整数c,编程计算s的一个子集s1,使得子集s1的和等于c。
【输入格式】
第一行有2个正整数n和c
第二行有n个正整数
【输出格式】
一行数据,按输入的顺序输出,若无解则输出"No Solution!"
【输入样例】
5 10
2 2 6 5 4
【输出样例】
2 2 6
【问题规模】
n<7000,c<maxlongint
C++
#include <bits/stdc++.h>
using namespace std;
const int Max = 9999;
int n, c;
int a[Max], vis[Max], ans[Max];
bool dfs(int f, int sum) {
if (sum > c)
return false;
if (sum == c) {
for (int i = 0; i < f; i++) {
if (i == 0)
cout << ans[i];
else
cout << " " << ans[i];
}
cout << endl;
return true;
}
for (int i = 0; i < n; i++) {
if (vis[i] == 0) {
vis[i] = 1;
ans[f] = a[i];
if (dfs(f + 1, sum + a[i]))
return true;
vis[i] = 0;
}
}
return false;
}
int main() {
memset(vis, 0, sizeof(vis));
cin >> n >> c;
int sum = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}
if (sum < c) {
cout << "No Solution!" << endl;
return 0;
}
if (!dfs(0, 0))
cout << "No Solution!" << endl;
return 0;
}
Python
n, c = map(int, input().split())
a = list(map(int, input().split()))
visited = [0 for i in range(n)]
ans = [0 for i in range(n)]
def dfs(k, s):
global n
if s > c:
return False
if s == c:
for i in range(k):
if i == 0:
print(ans[i], end='')
else:
print('', ans[i], end='')
print()
return True
for i in range(n):
if visited[i] == 0:
visited[i] = 1
ans[k] = a[i]
if dfs(k + 1, s + a[i]):
return True
visited[i] = 0
return False
if sum(a) < c:
print('No Solution!')
if not dfs(0, 0):
print('No Solution!')