加起来和为目标值的组合:
给定一个由不同整数构成的数组 nums 和一个整数 target ,请你从 nums 找出总和是 target 的组合的个数。解集中可以重复使用 nums 中的元素。且解集中数字顺序不同视为不同的组合。
解法一、DFS
out=0
class Solution:
def combination(self , nums , target ):
nums.sort()
numlen=len(nums)
def dfs(t):
global out
if sum(t) > target:
return
if sum(t) == target:
out=out+1
return
for num in nums:
dfs(t + [num])
dfs([])
return out
解法二、动态规划
def combination(self , nums , target ):
dp = [0 for _ in range(target+1)]
dp[0] = 1
for j in range(target+1):
for i in range(len(nums)):
if j-nums[i]>=0:
dp[j]=dp[j]+dp[j-nums[i]]
return dp[-1]
一、数组中
1.从1到n的n个数,顺序对的数量是 k,(顺序对是指满足 i < j 且 A[i] < A[j] 的对数),其中有m个位置未知,请返回所有的个数。
void dfs(List<Integer> pos, int index, int count, int base, int k, int n) {
if (index == count) {
if (base == k) res++;
} else {
int position = pos.get(index); // 此时要插入的位置
for (int i = 0; i < count; i++) {
if (seen[i]) continue
seen[i] = true;
nums[position] = cands[i];
int amount = 0;
for (int j = 0; j < position; j++)
if (nums[j] < cands[i]) amount++;
for (int j = position+1; j < n; j++)
if (cands[i] < nums[j]) amount++;
dfs(pos, index+1, count, base+amount, k, n);
nums[position] = 0;
seen[i] = false;
}
}
}
2.