给定数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。
eg:
arr = {5、10、25、1}, aim = 1000.
暴力搜索法、递归
int coins1(int[] arr, int aim)
{
if(arr == NULL || arr.length == 0 || aim < 0)
return 0;
return process1(arr,0,aim);
}
int process1(int[] arr, int index, int aim)
{
int ans = 0;
if(index = arr.length())
{
if(aim == 0)
return 1;
else
return 0;
}
else
{
for(int i = 0; i*arr[index] <= aim; i++)
{
ans += process1(arr,index+1,aim-i*arr[index]);
}
}
return ans;
}
记忆搜索法(有保存的递归)
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);
}
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; i*arr[index] <= aim; i++)
{
mapvalue = map[index+1][aim-i*arr[index]];
if(mapvalue == 0)
res+=process2(arr,index+1,aim-i*arr[index],map);
else
res+=mapvalue==-1 ? 0:mapvalue;
}
}
map[index][aim] = res==0? -1:res; //用-1来区分 是map里没有 还是有但是等于0;
return res;
}
动态规划
动态规划动态规划动态规划 各种例子
案例1.跳台阶
案例2.最短路径和 ,只能向下走或者向右走
案例3.给定数组arr,返回arr的最长递增子序列长度
arr= [2,1,5,3,6,4,8,9,7] 最长递增子序列为[1,3,4,8,9] 所以返回长度5
案例4.
案例5. 背包
案例6.
最后返回右下角的值