hdu 2048 错排数目
考虑dp
dp[i] 表示了前i个数搓牌的方案数
a 去了 b
<1> b 去了 a dp[i - 2] * (i - 1)
<2> b 没去 a dp[i - 1] * (i - 1)
hdu 2062
题意是指n个元素的排序第m个长什么样?
brute force
从集合角度思考
对于n个元素的排列尝试将其分成n份,分别代表以n开头的有多少。其实吧还是个dp
f[n] = (f[n - 1] + 1) * n
我去了一个元素是不是等于n - 1个的时候答案,不要管是否l,其次加一个空集
现在从 例6来看
3 10
首先确定在第几组,知道f[3] = 15,分三组 每组5个
来看:
10 / 5 = 2 在第二组理应输出 2
是不是应该减去次次的贡献? 少了一个字符而言对于整体的影响是什么呢?
情况1 当 有余数的时候代表 它 是 d + 1 组
情况2 当无余数应该改变d以上
01 背包
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大
dp 状态 dp[i][j] 为前i件 体积为j 的最大价值
至于 体积为什么倒着 其实可以思考流水线的数据冲突 或者说叫做这个物品可能被多次使用
完全背包
有N种物品和一个容量为 V 的背包,每种物品都有无限件可用。第i种物品的费用是ci ,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
对于无限这个事情 应该考虑的是 多次利用 正着 for 是不是会对次数不限制,倒着for 每次用的在同一件物品都是个旧状态。
多重背包
有N种物品和一个容量为 V 的背包。第i种物品最多有ni件可用,每件费用是 ci,价值是 wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
思考我们当前要限制倒着for 我们才能从一个旧状态来
可以尝试二进制分解降低复杂度
晚上开始写题解和相对应算法