码迷,mamicode.com
首页 > 编程语言 > 详细

算法练习 -- DP 查找和为指定数字的数组

时间:2015-06-27 18:25:11      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

问题:

从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 j

static 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 x
static 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]就是问题的解

版权声明:本文为博主原创文章,未经博主允许不得转载。

算法练习 -- DP 查找和为指定数字的数组

标签:

原文地址:http://blog.csdn.net/lan_liang/article/details/46662259

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!