这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
问题描述
给出一个数组,a[7]={3,34,4,12,5,2}
再给出一个值s=13;
我们判断a中是否一到多位数字之和等于s的值,如果有,输出true,否则,输出false。
解决策略
这一题需要使用到动态规划的思想。
我们建立数组subset[i][j],其中i表示a数组的下标,j表示s剩余的值。数组的含义为当前值是否能够加到s,取值分别为true,false。
我们对subset数组赋予初始值。
for(int index=0;index<a.length;index++) {
subset[index][0]=true;
}
for(int sNum=0;sNum<s+1;sNum++) {
subset[0][sNum]=false;
}
subset[0][a[0]]=true;
代码
package day_04;
public class 动态规划例题02 {
public static void main(String[] args) {
int[] arr= {3,34,4,12,5,2};
int s=13;
System.out.print(fun(arr,s));
}
static boolean fun(int[] a,int s) {
boolean subset[][]=new boolean[a.length][s+1];
for(int index=0;index<a.length;index++) {
subset[index][0]=true;
}
for(int sNum=0;sNum<s+1;sNum++) {
subset[0][sNum]=false;
}
subset[0][a[0]]=true;
for(int i=1;i<a.length;i++) {
for(int j=1;j<s+1;j++) {
if(a[i]>j) {
subset[i][j]=subset[i-1][j];
}
else {
boolean A=subset[i-1][j-a[i]];
boolean B=subset[i-1][j];
subset[i][j]=A||B;
}
}
}
return subset[a.length-1][s];
}
}
结果实验
s=13
s=15
package day_04;
public class 动态规划例题02 {
public static void main(String[] args) {
int[] arr= {3,34,4,12,5,2};
int s=15;
System.out.print(fun(arr,s));
}
static boolean fun(int[] a,int s) {
boolean subset[][]=new boolean[a.length][s+1];
for(int index=0;index<a.length;index++) {
subset[index][0]=true;
}
for(int sNum=0;sNum<s+1;sNum++) {
subset[0][sNum]=false;
}
subset[0][a[0]]=true;
for(int i=1;i<a.length;i++) {
for(int j=1;j<s+1;j++) {
if(a[i]>j) {
subset[i][j]=subset[i-1][j];
}
else {
boolean A=subset[i-1][j-a[i]];
boolean B=subset[i-1][j];
subset[i][j]=A||B;
}
}
}
return subset[a.length-1][s];
}
}