52 动态规划和回溯算法求解组合总和问题

问题描述:找出所有相加之和为n的k个数的组合。组合中只允许包含1-9的正整数,并且每种组合不存在重复的数字。

动态规划求解:定义Boolean类型dp[i][j]表示从前i个元素中选取一些元素使得总和为j的情况是否为真,对于每一个i元素都有选择与不选择两种,dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]]这两种情况,当然需要保证nums[i]

public Boolean isSum(int []nums,int targert)
{
Boolean [][] dp=new Boolean [nums.length][target+1];
if(nums[0]==0)
{
dp[0][0]=true;
}else
{
dp[0][0]=false;
}
for(int i=1;ij)
{
dp[i][j]=dp[i-1][j];
}else
{
dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]];
}
}
}
return dp[nums.length-1][target];
}

dfs方法求解:对于每个元素都有选或者不选两种情况,可以进行分别描述

public Boolean tranceBack(int []nums,int target,int index)
{
if(target==0){return true;}
for(int i=index;itarget)
{
if(tranceback(nums,target,index+1)){return true;}
}else
{
if(tranceBack(nums,target-nums[i],index+1)){return true;}
if(tranceBack(nums,target,index+1)){return true;}
}
}
return false;
}
public Boolean TranceBack(int []nums,int target)
{
return tranceBack(nums,target,0);
}

你可能感兴趣的:(JAVA刷题500道,算法,动态规划,java,开发语言,数据结构,深度优先)