一个数组中,求出最接近一个数的组合

lyqiang00 2019-11-18 10:56:07
在一个数组中,例如int[] arr = {1,4,2,4,6,7,3,4,9,24,50,100};
排列组合不能重复,要求出该数组排列组合的值<=25,其中最大值是多少?
答案:{1,24}=25; {1,4,4,6,7,3} = 25; {1,4,2,4,7,3,4}=25; {1,4,6,2,3,9}=25 ......
怎么用代码求出来呢
...全文
1063 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
活在梦里吗 2019-11-24
  • 打赏
  • 举报
回复
package 不去重符合条件的组合;

import java.util.Arrays;

public class Test {
    public static final int SUM = 25;

    public static void main(String[] args) {
        int[] a = {1, 4, 2, 4, 6, 7, 3, 4, 9, 24, 50, 100};
        // 1、数组排序
        Arrays.sort(a);
        // 2、除去数组中大于SUM的值
        int[] arr = dropGreater(a, SUM);
        // System.out.println(Arrays.toString(arr));
        // 3、求数组中排列组合的最大值
        int max = arr[arr.length-1];
        int sum = 0;
        max = getMax(arr, 0, sum, max);
        // System.out.println(max);
        // 4、求数组中符合最大值的排列组合
        int[] record = new int[arr.length];
        int[] count = {1};
        f1(0,count,0,arr,record);
    }

    
    // 丢掉数组中比SUM大的数
    public static int[] dropGreater(int[] arr, int num) {
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > num) {
                index = i;
                break;
            }
        }
        int[] a = new int[index];
        for (int i = 0; i < index; i++) {
            a[i] = arr[i];
        }
        return a;
    }

    // index表示从arr数组对应的坐标开始排列组合
    public static int getMax(int[] arr, int index, int sum, int max) {
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            if (sum==SUM)
                return sum;
            if (sum>SUM)
                break;
            if (sum > max && sum < SUM)
                max = sum;
            return getMax(arr, i + 1, sum, max);
        }
        return max;
    }


    // count数组用来记录当前为几层循环
    public static void f1(int index,int[] count,int sum,int[] arr,int[] record) {

        for (int i = index; i < arr.length; i++) {
            record[count[0]-1]=arr[i];
            if (sum+arr[i]>SUM) {
                count[0]--;
                break;
            }
            if (sum+arr[i]==SUM) {
                for (int j = 0; j < count[0]; j++) {
                    System.out.printf("%d ", record[j]);
                }
                System.out.printf("\n");
                count[0]--;
                break;
            }
            if (sum+arr[i]<SUM) {
                count[0]++;
                f1(i+1,count,sum+arr[i],arr,record);
            }
        }
    }


    // 帅选出arr数组中能拼凑出来的小于max的所有数,并用数组记录组合的数字,封装sum和数组进Map集合
}
最后一个注释中的思路应该比f1方法的效率更高点,没去具体做了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧