选数问题:给定n个数字,从中选择k个使他们的和为s,求有几种组合方式。c++

选数问题

给定n个数字,从中选择k个使他们的和为s,求有几种组合方式。
第一行会给一个T(T<=100),表示测试数据的组数,每一组中有两行,第一行中有三个数字n,k,s;第二行给定n个数字。
将可能的组合方式数输出。保证k<=n<=16,所有的数字范围都在32位整数的表示范围内。

sample input:
1
10 3 10
1 2 3 4 5 6 7 8 9 10

sample output:
4

思路:

  1. 由于题目给定了数字范围不会太大,所以当然可以无脑暴力,写个循环,每次保证第i个数被取到,再嵌套循环取i+1位置的数字,循环检查是否能k个数字加起来等于s,若等于就count++;最后输出count就可以。
  2. 可以使用递归的方式来解决,其实原理比较像深搜(一条树的分支走到黑然后返回),需要判断的就是他的结束条件,只有当k==0(可以用的数字用完了)并且sum == 0(恰好等于想得到的值)才说明这个选择是对的,返回值1。
  3. 对于每一层递归,相当于是一个二叉树,有两个选择方向:选择当前数或者不选择;对他们的结果求和就能返回答案。
  4. 对于判断条件(begin>=length)一定要注意他放置的位置,需要在判断完+1之后再判断是否大于等于,如果需要选择的数字在最后一位的话,将该判断条件放到前面会导致
    组合方式缺少。或者可以写两个判断条件,先判断if(begin>length),在完成成功判断后,再判断一遍if(begin>=length)
  5. 由于这里我们需要计算数组的长度,所以最好使用动态数组,如果自己创建数组的话需要注意,将数组传入函数后,使用sizeof(a)来做是错误的,他会返回数组的大小*8,返回地址长度,所以比较建议使用vector,并用size()取数组长度。
#include <iostream>
#include <string>
#include <algorithm&g
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于给定的整型数组n,将数组中的值组合成x,有多种方法可以实现。 一种常见的方法是使用递归。我们可以定义一个递归函数,该函数接受数组、目标值x和当前索引作为参数。在每一次递归调用中,我们有两种选择:要么将当前索引的元素包含在组合中,要么不包含。如果选择包含当前索引的元素,则目标值x减去该元素的值,并将索引加1。如果选择不包含当前索引的元素,则只需将索引加1。递归终止条件是当目标值x等于0时,说明找到了一种组合方式;当索引超过数组长度时,说明已经遍历完所有元素。 以下是一个示例代码实现: ```cpp #include <iostream> #include <vector> int countCombinations(std::vector<int>& nums, int x, int index) { if (x == 0) { // 找到一种组合方式 return 1; } if (index >= nums.size()) { // 已经遍历完所有元素 return 0; } // 不包含当前索引的元素 int count = countCombinations(nums, x, index + 1); // 包含当前索引的元素 count += countCombinations(nums, x - nums[index], index + 1); return count; } int main() { std::vector<int> nums = {1, 2, 3}; int x = 4; int count = countCombinations(nums, x, 0); std::cout << "有 " << count << " 种组合方式" << std::endl; return 0; } ``` 在以上示例中,数组`nums`为`{1, 2, 3}`,目标值`x`为4。程序输出结果为"有 4 种组合方式",即数组元素的组合方式为{1, 3}、{2, 2}、{1, 2, 1}和{3, 1}。 希望以上解答能够对你有所帮助!如有任何疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值