算法练习 -- DP 查找和为指定数字的数组
来源:互联网 发布:网络综艺 编辑:程序博客网 时间:2024/05/22 16:46
问题:
从2,4,3,5,7,1,9,10中找出多个数,和为11
这个题目是0 1背包的一个变体,因此可用DP来解。
DP解法的关键在于得到递推公式,对于这个问题来说,DP公式为:
j ∈[1,11]
i ∈[0,7]
dp[i][j] = 从(arr[i], dpArr[i-1][j], arr[i] + dpArr[i-1][j], arr[i]+ dpArr[i-1][j-arr[i]]) 中选出小于j的最大值
具体代码如下:
void Main(){DpFind();Console.WriteLine(dpArr);}static int n = 11;static int[] arr = new int[]{2,4,3,5,7,9,10,6};static int[,] dpArr = new int[8,12];//j = 1..n , loop each element in arr//dpArr[i,j] = Max(arr[i], dpArr[i-1][j], arr[i] + dpArr[i-1][j], arr[i]+ dpArr[i-1][j-arr[i]]) and the max not gather than jstatic void DpFind(){for(var i = 0; i < arr.Length; i++){for(var j = 1; j <= n; j++){if(i == 0){var max = arr[i] > j ? 0 : arr[i];dpArr[i,j] = max;results[i+","+j] = max;}else if(i > 0){var maxArr = new List<int>(){arr[i], dpArr[i-1,j],arr[i] + dpArr[i-1,j]};if(j > arr[i]){maxArr.Add(arr[i] + dpArr[i-1,j-arr[i]]);}dpArr[i,j] = MaxLessThan(j,maxArr.ToArray());}}}}//find the max element in arr when less than xstatic int MaxLessThan(int x , params int[] arr){int s = 0;for(var i = 0;i < arr.Length; i++){if(arr[i] > s && arr[i] <= x){s = arr[i];}}return s;}
DP中最后1个元素即dpArr[7][11]就是问题的解
0 0
- 算法练习 -- DP 查找和为指定数字的数组
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- 算法练习之二维数组的查找
- 编程练习:求和为指定数字的所有组合
- 数组求和为指定数字
- 面试算法题:从指定数组找出两数的和为指定的数
- 待字闺中之正数数组内和为指定数字的总数
- 待字闺中之正数数组内和为指定数字的总数
- 在数组中查找和为给定值的两个数字(排序数组和不排序数组)
- 数组中重复的数字和查找
- 在排序数组中查找和为给定值的两个数字
- 在排序数组中查找和为给定值的两个数字
- 在排序数组中查找和为给定值的两个数字
- 在排序数组中查找和为给定值的两个数字--总结
- 14.在排序数组中查找和为给定值的两个数字
- 在排序数组中查找和为给定值的两个数字
- RUBY-二进制文件操作
- 网上某位牛人的deep learning学习笔记汇总
- Android中摇一摇效果的实现
- crypto++ 中DES AES RC5 RC6 TEA XTEA XXTEA加密算法性能比较
- NoSQL系列:选择合适的数据库
- 算法练习 -- DP 查找和为指定数字的数组
- 欢迎使用CSDN-markdown编辑器
- 从 c# 到java
- RUBY-数组操作
- 一起talk GCC吧(第五回:GCC优化)
- 欢迎使用CSDN-markdown编辑器
- 算法分析与设计矩阵连乘问题
- 通过NFS启动自制的网络文件系统遇到的问题总结
- 微信开放平台和公众平台的区别