问题
有 n 种物品,第i种物品的每个物品的价值是 ai ,数目是 mi 。判断是否可以选择若干数字使得价值和是K。
数据范围
1≤n≤100
1≤ai,mi,≤105
1≤K≤105
多重背包
思路
看作背包大小是K,物品的价值和体积都是 ai ,物品数目是 mi 的多重背包。如果最大价值是 K 的话就是可以选出,否则便是不能选出。
复杂度
利用二进制分解,可以使时间复杂度达到
O(K∑log2mi)
。
大约有
1.7×108
,显得略大。
另解
思路
设 dp[i][j] 表示前 i 种数字组合成 j 之后,至多剩余的
ai
的个数。
那么:
dp[i][j]=⎧⎩⎨mi,−1,dp[i][j−ai]−1,dp[i−1][j]>0j<ai or dp[i][j−ai]≤0otherwise
dp[n][K]≥0 说明可以取出,否则即不可以。
复杂度
O(nK) ,大约是 107 。