Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
- The solution set must not contain duplicate combinations.
For example, given candidate set 2,3,6,7
and target 7
,
A solution set is:
[7]
[2, 2, 3]
此题即给定数量的币值,如25分,10分,5分,1分,编写计算n分的有多少种表示方法变种
就是枚举,用DFS
每种情况可能:target/candidate[level] 去遍历 。注意的先排序保证非递减!
第一次:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void combine_sum(vector<int> &candidate,int target,int level ,int sum,vector<int> res_one,vector<vector<int>> &res);
vector<vector<int>> combine_sum_final(vector<int> &candidate,int target);
int main()
{
vector<int> candidate;
int target;
int temp;
cin >> temp;
while (temp >= 0)
{
candidate.push_back(temp);
cin >> temp;
}
cout<<endl;
cin>>target;
vector<vector<int>> res;
res = combine_sum_final(candidate,target);
cout<<"res:" <<res.size()<<endl;
for (int i = 0 ;i < res.size();i++)
{
for (int j = 0;j <res[i].size();j++)
{
cout<< res[i][j]<<" ";
}
cout<<endl;
}
}
vector<vector<int>> combine_sum_final(vector<int> &candidate,int target)
{
sort(candidate.begin(),candidate.end());
if (target == 0 || candidate.size() == 0 || candidate[0] <= 0)
{
return vector<vector<int>>();
}
vector<int> res_one;
vector<vector<int>> res;
combine_sum(candidate,target,0,0,res_one,res);
return res;
}
//需保证target 非0 !!
void combine_sum(vector<int> &candidate,int target,int level ,int sum,vector<int> res_one,vector<vector<int>> &res)
{
if (level >= candidate.size())
{
if ( sum == target)
{
res.push_back(res_one);
}
return ;
}
for (int i = 0;i <= ((target - sum)/candidate[level]); i++)
{
sum = sum + candidate[level]*i;//同层会相互影响,在后面必须还原!!
if (sum > target)
{
return ;
}
for (int j = 1;j <= i;j++)
{
res_one.push_back(candidate[level]);//需在后面还原!
}
combine_sum(candidate,target,level+1,sum,res_one,res);
for (int j = 1;j <= i;j++)
{
res_one.pop_back();
}
sum = sum - candidate[level]*i;
}
}
第二次:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
sort(candidates.begin(),candidates.end());
if (target == 0 || candidates.size() == 0 || candidates[0] <= 0)
{
return vector<vector<int>>();
}
vector<int> res_one;
vector<vector<int>> res;
//combine_sum(candidates,target,0,0,res_one,res);
combine_sum(candidates,target,0,res_one,res);
return res;
}
void combine_sum(vector<int> &candidate,int target,int level ,vector<int> res_one,vector<vector<int>> &res)
{
if (target < 0)
{
return ;
}
if (level >= candidate.size())
{
if (target == 0)
{
res.push_back(res_one);
}
return ;
}
for (int i = 0;i <= (target/candidate[level]); i++)
{
for (int j = 1;j <= i;j++)
{
res_one.push_back(candidate[level]);
}
combine_sum(candidate,target - candidate[level]*i,level+1,res_one,res);
for (int j = 1;j <= i;j++)
{
res_one.pop_back();
}
}
}