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

问题:

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

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

时间: 2024-10-12 20:55:14

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

算法--有序矩阵查找指定数

第18节 有序矩阵查找练习题 现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x. 给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x.所有矩阵中数字及x均为int范围内整数.保证n和m均小于等于1000. 测试样例: [[1,2,3],[4,5,6],[7,8,9]],3,3,10 返回:false Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public

待字闺中之正数数组内和为指定数字的总数

求正数数组内和为指定数字的合并总数 比如[5, 5, 10, 2, 3] 合并值为 15 : 有4种 : (5 + 10, 5 + 10, 5 + 5 + 2 + 3, 10 + 2 + 3) 分析:有的时候,一个题目不能够立刻想到比较优化的想法,就可以先找到一个解决方案,然后根据方案的不足进行优化.而且这个时候,逆转一下思路,便会柳暗花明.由递归到动态规划,不就是如此么? 我们设定f(index,sum)表示数组从index开始到结束组成的sum的总数.那么,f(index, sum)可以表示

Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件

Linux下find一次查找多个指定文件或者排除某类文件,在 GREP 中匹配多个关键字的方法(1)Linux下find一次查找多个指定文件:查找a.html和b.html find . -name "a.html"  -name "b.html" find . -regex '.*\.txt\|.*\.doc\|.*\.mp3' find . -regex '.*\.txt\|.*\.doc\|.*\.mp3' ./a.txt ./a.doc ./a.mp3 (2

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

如何在有序数组中给出指定数字出现的次数

问题描述:如何在有序数组中给出指定数字出现的次数,例如:数组{1,2,2,2,3,4,5} 数字2的出现次数为3. 最简单的方法是遍历数组,代码如下: #include <stdio.h> //如何在有序数组中给出指定数字出现的次数 int binarysearch(int *a,int n,int x) { int cnt=0; for(int i=0;i<n;i++) { if(a[i]==x) cnt++; } return cnt; } int main() { int a[10

STL算法总结之查找算法示例

STL算法总结之查找算法示例 1.adjacent_find: // 所有容器适用(线性的) adjacent_find(begin,end); adjacent_find(begin,end,Predicate); 在范围[first,last)之间寻找第一次出现的两个连续相等的元素,如果存在,则返回指向第一个元素迭代器,否则返回last.还可以使用自己定义的二元断言(就是自定义的判断方法) #include<vector> #include<iostream> #include

Java中的查找算法之顺序查找(Sequential Search)

Java中的查找算法之顺序查找(Sequential Search) a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 找到数组中存在数据8,返回位置. 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static vo

统计指定数字和

输入一个数字的字符串和一个数字字符(1到9),统计这个数字在字符串中出现的次数,并累加.例如有个字符串是1234321,查找2这个数字,在字符串中出现了2次,所以累计和就是2+2=4 输入格式: 输入2行.第1行是字符串,第2行是要查找的数字. 输出格式: 指定数字出现的累加和 输入样例: 1234321 2 输出样例: 4 n=str(input()) p=str(input()) print(n.count(p)*int(p)) 原文地址:https://www.cnblogs.com/Sk

hdu3709 数位dp(自身平衡的数字)

http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit.