子集和问题(回溯法)
题目内容
给定n个不同的正整数集合w={w1, w2, …, wn)和一个正整数W,要求找出w的子集s,使该子集中所有元素的和为W。
注意:此题必须采用回溯法,否则不得分。
输入要求
首先数据一行数据,包含两个整数W(1 <= W <= 10000)和n(1 <= n <= 20),分别表示和以及整数的个数。
第二行包含n个整数,依次表示第i个整数的值w(0 <= w[i] <= 100)。
输出要求
如果子集存在,则输出满足条件的子集的个数,否则输出“no",并换行。
测试数据
输入
31 4
11 13 24 7
输出
2
参考答案
#include <iostream>
using namespace std;
void lp(int i, int tw, int n, int w[], int W, int& t)
{
if (i >= n)
{
if (tw == W)
{
t++;
}
}
else
{
if (tw + w[i] <= W)
{
lp(i + 1, tw + w[i], n, w, W, t);
}
lp(i + 1, tw, n, w, W, t);
}
}
int main()
{
int W, n;
while (cin >> W >> n)
{
int* w = new int[n];
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
int t = 0;
lp(0, 0, n, w, W, t);
if (t == 0)
{
cout << "no\n" << endl;
}
else
{
cout << t << "\n" << endl;
}
}
}