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