入门动态规划(三)——是否存在和值

112 阅读1分钟

这是我参与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

image.png

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];
	}

}

image.png