题目描述
(子集和数问题) 已知n+1个正数:wi,1≤i≤n,和M。要求找出wi的和数是M的所有子集。例如,若n=4,(w1,w2,w3,w4)=(11,13,24,7),M=31,则满足要求的子集是(11,13,7)和(24,7)
思路
通过回溯法递归求解大小为1-n的子集
// 该算法为求某个m大小的子集的经典模板
// t为遍历到的层数,m为子集的大小,c为当前元素下标
backtrack(int t,int c){
if(t==m){
ans.push_back(res);
return;
}else{
// n为集合大小
for(int i=c;i<n;i++){
// nums是集合
res.push_back(nums[i]);
backtrack(t+1,i+1);
res.pop_back();
}
}
代码
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
#define n 4
int M=31;
int nums[n]={11,13,24,7};
void bt(int t,int m,int idx,int &sum,vector<int> &res){
if(t==m){
if(sum==M){
ans.push_back(res);
for(int j=0;j<res.size();j++)
cout<<res[j]<<' ';
cout<<endl;
}
return;
}else{
for(int i=idx;i<n;i++){
res.push_back(nums[i]);
sum+=nums[i];
bt(t+1,m,i+1,sum,res);
sum-=nums[i];
res.pop_back();
}
}
}
int main(){
int m=3;
int sum=0;
vector<int> res;
for(int m=1;m<=n;m++){
bt(0,m,0,sum,res);
}
}