Combination Sum

来源:互联网 发布:人工智能 无人驾驶 编辑:程序博客网 时间:2024/05/21 18:35

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 (a1a2, … , 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();} }}


0 0
原创粉丝点击