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 (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();} }}
0 0
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- mac os命令
- QTP正则表达式--邮箱动态链接
- android开发
- NGUI之UILabel颜色渐变效果
- SqlMethods操作
- Combination Sum
- Android开发规范——命名
- HTTP协议整理笔记
- js 去掉字符串里面所有的逗号或者其他符号
- Unity3d流光效果
- celery最佳实践
- 夏令营的9if静暗特
- 数组(遍历)(最值)
- Java 跳出递归循环问题