摘要:
问题一:划分数 问题描述 有n个去区别的物体,将它们划分成不超过m组,求出划分方法数模M的余数。 我们定义dp[i][j],表示j的i划分的总数 将j划分成i个的话,可以先取出k个,然后将剩下的j k个分成i 1份。 考虑n的m划分Ai,如果对于每一个i都有Ai 0,那么Ai 1就对应了n md的m 阅读全文
摘要:
问题描述 有一个长为n的子序列A0,A1···An 1。求出这个序列中最长的上升子序列的长度。上升子序列指的是对于任意的i include using namespace std; int n; int a[1000]; int dp[1000]; void solve() { int ans=0; 阅读全文
摘要:
题目描述 有n种不同大小的数字Ai,每种各Mi个。判断是否能从这些数字中选出若干个使它们的和恰好为K。 这个问题可以用DP求解,递推关系式的定义会影响最终的复杂度。 第一种定义: dp[i+1][j],用前i种数字是否能加和成j 为了用前i种数字加和成j,也就需要能用前i 1种数字加和成j,j Ai 阅读全文
摘要:
对于普通的01背包问题,如果修改限制条件的大小,让数据范围比较大的话,比如相比较重量而言,价值的范围比较小,我们可以试着修改dp的对象,之前的dp针对不同的重量限制计算最大的价值。这次用dp针对不同的价值计算最小的重量。 定义dp[i+1][j],前i个物品中挑选出价值总和为j时总重量的最小值(不存 阅读全文
摘要:
问题描述: 有n种重量和价值分别为Wi,Vi的物品,从这些中挑选出总重量不超过W的物品,求出挑选物品的价值总和的最大值,每种物品可以挑选任意多件。 分析: 令dp[i+1][j]表示从前i件物品中挑选总重量不超过j时总价值的最大值。则递推关系为: dp[0][j]=0; dp[i+1][j]=max 阅读全文
摘要:
给定两个字符串,求出这两个字符串的最长公共子序列的长度。 输入 abcd becd 输出 3(bcd) 分析: 我们定义: dp[i][j],S1···Si和T1···Tj对应的最长公共子序列的长度 当Si+1=Tj+1时,在S1···Si和T1···Tj对应的最长公共子序列的末尾追加上Si+1 S 阅读全文
摘要:
题目引入: 有n个重量和价值分别为Wi,Vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中的价值总和的最大值。 分析: 首先,我们用最普通的方法,针对每个物品是否放入背包进行搜索。 include include using namespace std; int n,W; int 阅读全文