アルゴリズムは、配列中の要素とある数を求めます。
1、もっと簡単なテーマ:全部でn個の数を判断して、1-nから、その中の一つとSの一つのシーケンスを探し出します。
このテーマは一つのウィンドウを維持するために、もしウィンドウの中の数がSより小さいなら、Sより大きいなら、左の数を削除します。
このテーマは一つのウィンドウを維持するために、もしウィンドウの中の数がSより小さいなら、Sより大きいなら、左の数を削除します。
import java.util.ArrayList;
public class Solution {
public ArrayList> FindContinuousSequence(int sum) {
ArrayList> listAll = new ArrayList<>();
for (int i = (int) Math.sqrt(sum * 2); i >= 2; i--) {
if (((i & 1) == 1 && sum % i == 0) || (sum % i) * 2 == i) {
ArrayList list = new ArrayList<>();
for (int j = 0, k = (sum / i) - (i-1)/ 2; j< i; j++, k++) {
list.add(k);
}
listAll.add(list);
}
}
return listAll;
}
}
2、配列の要素は任意の要素であり、配列の中でSに結合できるすべてのシーケンスを判断し、数字が違っても、下付きが同じでも計算します。import java.util.*;
/**
* @Author: yd
* @Date: 2018/9/9 15:52
* @Version 1.0
*/
class Main {
private int count;//
private int TARGET_SUM;//
private int addAll = 0;//
private List list = new ArrayList<>();
public static void main(String[] args) {
new Main().getInfo();
}
private void getInfo() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
TARGET_SUM = m;//
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = sc.nextInt();
}
getAll(array, 0, array.length);
System.out.println(count);
}
/**
*
*
* @param array
* @param fromIndex
* @param endIndex
* @return
*/
public void getAll(final int[] array, int fromIndex, int endIndex) {
if (addAll >= TARGET_SUM) {//
if (addAll == TARGET_SUM) {
count++;
}
return;// ,
}
for (int i = fromIndex; i < endIndex; i++) {
if (addAll + array[i] <= TARGET_SUM) {
list.add(array[i]);
addAll += array[i];
getAll(array, i + 1, endIndex);
addAll -= list.remove(list.size() - 1);
}
}
}
}