- leetcode-40组合总和2
题型:回溯
难度:中等
题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
代码:
class Solution {
private:
vector<int> tempvec;
public:
void huisu(vector<int>& candidates,vector<vector<int> > &vec, int target,int cur,int begin){
if(cur == target)
{
vec.push_back(tempvec);
return;
}
for(int i=begin;i<candidates.size();i++)
{
if(cur+candidates[i] > target) break;
if(i!=begin && candidates[i-1]==candidates[i])
continue;
tempvec.push_back(candidates[i]);
huisu(candidates,vec,target,cur+candidates[i],i+1);
tempvec.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int> > vec;
sort(candidates.begin(),candidates.end());
huisu(candidates,vec,target,0,0);
return vec;
}
};
- leetcode-面试题08.11硬币
题型:动态规划
难度:中等
代码:
class Solution {
public:
int waysToChange(int n) {
vector<int> vecMoney(4,0);
vecMoney[0] = 1;
vecMoney[1] = 5;
vecMoney[2] = 10;
vecMoney[3] = 25;
vector<int> dp(n+1,0);
dp[0] = 1;
for(int i=0;i<4;i++)
{
for(int j=1;j<=n;j++)
{
if(j >= vecMoney[i])
{
dp[j] += dp[j-vecMoney[i]];
dp[j] %= 1000000007;
}
}
}
return dp[n];
}
};