java动态规划 计算数n由k个数相加而成的情况数

Python024

java动态规划 计算数n由k个数相加而成的情况数,第1张

public class MyClass {

    public static void main(String[] args) {

        System.out.println(">>> result count:" + method(6, 3))

    }

    public static int method(int n, int k) {

        List<List<Integer>> list = new ArrayList<>()

        for (int i = 0 i < k i++) {

            if (i == 0) {

                for (int j = 1 j < n j++) {

                    List<Integer> li = new ArrayList<>()

                    li.add(j)

                    list.add(li)

                }

                continue

            }

            List<List<Integer>> listNew = new ArrayList<>()

            for (List<Integer> integers : list) {

                for (int j = integers.get(integers.size() - 1) j < n j++) {

                    List<Integer> li = new ArrayList<>()

                    li.addAll(integers)

                    li.add(j)

                    listNew.add(li)

                    if (i + 1 == k) {

                        int res = 0

                        for (Integer integer : li) {

                            res += integer

                        }

                        if (res != n) {

                            listNew.remove(li)

                        }

                    }

                }

            }

            list.clear()

            list.addAll(listNew)

        }

        for (List<Integer> integers : list) {

            for (Integer integer : integers) {

                System.out.print(integer + "\t")

            }

            System.out.println()

        }

        return list.size()

    }

}

import java.util.Arrays

public class Test {

public static void getCha(int [] a,int []b){

int min =Integer.MAX_VALUE

int sss=0

int kkk = 0

int c = 0

int d = 0

for (int i = 0i <a.lengthi++) {

for (int j = 0j <b.lengthj++) {

int temp = Math.abs(a[i]-b[j])

if(temp<min){

min = temp

sss = a[i]

kkk = b[j]

c=i

d=j

}

}

}

System.out.println("最大差距:"+min+"数组A["+c+"]"+sss+"数组B["+d+"]"+kkk)

}

public static void main(String[] args) {

int []a = new int[8]

int []b = new int[12]

for (int i = 0i <a.lengthi++) {

a[i] = (int)( Math.random()*100)

}

System.out.println(Arrays.toString(a))

for (int i = 0i <b.lengthi++) {

b[i] = (int) (Math.random()*100)

}

System.out.println(Arrays.toString(b))

getCha(a,b)

}

}

有。常见的如下:

一是字符串,如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。

二是链表,在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。链表两个著名的应用是栈Stack和队列Queue。

三是树,这里的树通常是指二叉树,每个节点都包含一个左孩子节点和右孩子节点。

四是排序,五是递归vs.迭代。

六是动态规划,动态规划是解决下面这些性质问题的技术:一个问题可以通过更小子问题的解决方法来解决(即问题的最优解包含了其子问题的最优解,也就是最优子结构性质)。

有些子问题的解可能需要计算多次(也就是子问题重叠性质)。子问题的解存储在一张表格里,这样每个子问题只用计算一次。需要额外的空间以节省时间。爬台阶问题完全符合上面的四条性质,因此可以用动态规划法来解决。