动态规划算法

package poj;

/**
 * baolisousuo
 * @author Administrator
 *
 */
public class Solution2 {

	private static int [] arr = {1,2,4};
	private static int aim = 3;
	
	public static void main(String[] args) {
		System.out.println(arr[0]);
		int result = countWays(arr,aim);
		System.out.println(result);
	}
	
	public static int coins1(int[]arr,int aim){
		if (arr == null || aim <0 || arr.length == 0) {
			return 0;
		}
		return process1(arr,0,aim);
	}

	private static int process1(int[] arr, int index, int aim) {
		int res = 0;
		if (index == arr.length) {
			res = aim==0?1:0;
		}else{
			for (int i = 0;arr[index]*i <= aim;i++) {
				res+=process1(arr,index+1,aim-arr[index]*i);
			}
		}
		return res;
	}
	
	//jiyi
	public static int coins2(int[]arr,int aim){
		if (arr == null || arr.length == 0||aim <0) {
			return 0;
		}
		int [][]map = new int[arr.length+1][aim+1];
		return process2(arr,0,aim,map);
	}

	private static int process2(int[] arr, int index, int aim, int[][] map) {
		int res = 0;
		if (index == arr.length) {
			res = aim == 0?1:0;
		}else{
			int mapValue = 0;
			for (int i = 0;arr[index] * i <= aim;i++) {
				mapValue = map[index+1][aim-arr[index]*i];
				if (mapValue != 0) {
					res+=mapValue == -1?0:mapValue;
				}else{
					res+=process2(arr,index+1,aim-arr[index]*i,map);
				}
			}
		}
		map[index][aim] =res == 0?-1:res;
		return res;
	}
	//dp
	public static int countWays(int []arr,int aim){
		int [] f = new int[1001];
		for (int i = 0;i<f.length;i++) {
			f[i] = 0;
		}
		f[0] = 1;
		for (int i = 0;i<arr.length;i++) {
			for (int j = arr[i];j<=aim;j++) {
				f[j] =f[j-arr[i]]; 
			}
		}
		
		return f[aim];
	}
	
	
	
	
	
	
	
	
	
	
}

  

原文地址:https://www.cnblogs.com/airycode/p/5124667.html