一、完全背包
题目描述:
题目描述
有个背包可承受重量T,现有N件物品,每件物品重量为Wi,价值为Vi ,每件物品的数量是无穷的,这个背包可以装载物品的最大价值是多少?
输入格式
第一行,两个整数,分别表示T和N,用空格隔开(T≤1000,N≤100)
接下来T行,每行两个整数,分别表示N件物品的重量Wi和价值Vi(1≤Wi,Vi≤100)
输出格式
一行,表示这个背包可以装载物品的最大价值
输入输出样列
输入样例1:
100 5
77 92
22 22
29 87
50 46
99 90
🔑思路
完全背包和0-1背包的区别:“物品数量不是1 1个,而是无穷多个”。
那么:
对于物品i来说,最多能装多少个在背包里呢?
背包容量为C,最多能装C/w[i]个物品i。
💯解法
code1转多重背包:
将多重背包中的s[i]定义为C/w[i]进行求解。
过程:
one 定义状态: d(i,j)表示前i种物品放在承重量为j的背包里可以获得的最大价值。
two 状态转移方程:
dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);three 时间复杂度
O(N*C*K)
code2转01-背包:
将每种完全背包物品拆成C/w[i]件物品进行0-1背包的DP。
code3完全背包算法:
定义状态:d (i, j)表示为前i种物品分配j的背包空间,可以获得