给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
最简单暴力的方式就是找出其中所有可能的组合判断是否等于指定的k值,状态数是2的n+1次方,时间复杂度O(2^n),可以采用深度优先搜索遍历所有可能的情况。
static int n = 4;
static int k = 13;
static int[] arr = {1,2,4,7};
static Stack<Integer> s = new Stack<Integer>();//保存可能用到的数
public static void main(String[] args) {
if(dfs(0,0))
{
System.out.println("YES");
while(!s.isEmpty())
{
System.out.print(s.pop()+" ");
}
}
else{
System.out.println("NO");
}
}
private static boolean dfs(int i, int sum) {
if(i==n)
return sum==k;
if(dfs(i+1,sum))
return true;
if(dfs(i+1,sum+arr[i]))
{
s.push(arr[i]);
return true;
}
return false;
}
其中dfs()就是表示深度优先搜索的函数,dfs(i,sum)的直观意义就是表示前i项之和为sum,然后对于i项之后进行分支。
如果i=n,表示前面n项都计算完毕,
如果i<n,则需要判断是否需要添加上后一项arr[i].
即通过此方法遍历完毕上图中整个状态。