如何在一个数组中求出任意几个数的和等于给定数

代码:

import java.util.*;
 
public class Organize1 {
    static int[] iArray = {0, 2, 3, 1, 4, 10, 23, 7, 8, 9, 6, 3};
    static ArrayList<String> list = new ArrayList<String>();
    static Set<String> index = new TreeSet<String>();
    static StringBuilder str;
    static StringBuilder indexStr;
    static int sum;
     
    public static void org(int[] iArray, int start){
        for(int i=0; i<iArray.length; i++){
            sum = iArray[i];
            str = new StringBuilder();
            str.append(iArray[i]);
            indexStr = new StringBuilder();
            indexStr.append(i);
 
            for(int j=start; j<iArray.length; j++){                                   
                if(i != j){
                    sum += iArray[j];
                     
                    if(sum == 10){
                        str.append("+"+ iArray[j]);
                        indexStr.append("+"+ j);
                        int size = index.size();
                        index.add(indexStr.toString());
                         
                        if(index.size() > size)
                            list.add(str.toString());                           
                    }
                    if(sum < 10){
                        str.append("+"+ iArray[j]);
                        indexStr.append("+"+ j);
                    }
                    if(sum > 10){                       
                        sum -= iArray[j];                           
                    }
                }
            }
        }
    }
     
    public static void main(String args[]){   
        for (int i=0; i<iArray.length; i++)
            org(iArray, i);
        System.out.println(list.toString());
    }
}

 结果

[0+2+3+1+4, 2+0+3+1+4, 3+0+2+1+4, 1+0+2+3+4, 4+0+2+3+1, 10+0, 7+0+2+1, 8+0+2, 9+0+1, 2+3+1+4, 3+2+1+4, 1+2+3+4, 4+2+3+1, 7+2+1, 8+2, 9+1, 7+3, 6+3+1, 2+1+4+3, 6+1+3, 0+4+6, 3+4+3, 4+6, 7+3, 6+4, 0+10, 3+7, 3+7, 0+7+3, 2+8, 1+9, 1+6+3]

 

转载于:https://www.cnblogs.com/luoruiyuan/p/9132024.html

这个问题可以使用回溯法(backtracking)来解决。具体步骤如下: 1. 定义一个,该函接受四个参数组、目标值、当前和、当前索引。 2. 在函中,使用循环遍历数组,从当前索引开始,依次选择每个元素进行加法运算,计算出当前和。如果当前和等于目标值,则将当前结果存储在结果集中,并返回。 3. 如果当前和小于目标值,则继续递归调用函,将当前索引加一,并将当前和传入下一层递归函。 4. 如果当前和大于目标值,则不再继续递归调用函。 5. 在主函中调用上述函,并打印出结果集中的所有结果。 参考代码如下: ```c++ #include <iostream> #include <vector> using namespace std; void backtracking(vector<int>& nums, int target, int sum, int index, vector<vector<int>>& res, vector<int>& cur) { if (sum == target) { res.push_back(cur); return; } for (int i = index; i < nums.size(); i++) { if (sum + nums[i] > target) { continue; } cur.push_back(nums[i]); backtracking(nums, target, sum + nums[i], i + 1, res, cur); cur.pop_back(); } } int main() { vector<int> nums = {1, 2, 3, 4, 5}; int target = 7; vector<vector<int>> res; vector<int> cur; backtracking(nums, target, 0, 0, res, cur); for (auto& r : res) { for (auto& n : r) { cout << n << " "; } cout << endl; } return 0; } ``` 在上述代码中,我们将结果存储在了一个二维数组 res 中,每个一维数组表示一个符合条件的结果。在主函中,我们打印出了所有的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值