完全背包问题的解决方法______闫氏 DP 分析法
创始人
2024-01-31 08:23:05
0

完全背包问题的解决方法:

闫氏 DP\ DP DP 分析法:
通过集合划分,我们可以得到第 i\ i i 个物品有两种状态:
 1.选 1−T\ 1 - T 1−T 个,最优解为前 i−1\ i− 1 i−1 个物品的所有选择中,还能选取当前 k\ k k 个第i\ i i 个物品的最大价值加上 k\ k k 个第 i\ i i 个物品本身的价值,即
dp[i][j]=max(dp[i][j],dp[i−1][j−k∗v[i]]+k∗w[i]),(1≤k≤T)\ dp[ i ][ j ]= max( dp[ i][ j], dp[ i− 1][ j− k∗ v[i]]+k∗w[i]),(1≤k≤T) dp[i][j]=max(dp[i][j],dp[i−1][j−k∗v[i]]+k∗w[i]),(1≤k≤T)
 2.不选,最优解为前i−1\ i−1 i−1个物品的所有选择中的最大价值,即 dp[i][j]=dp[i−1][j]\ dp[i][j]=dp[i−1][j] dp[i][j]=dp[i−1][j]
若使用枚举的方式来选取1−k\ 1−k 1−k个物品 i的情况,会超时,故需分析当前的状态转移方程能否被优化。
我们令该朴素转移方程为 A式:
dp[i][j]=max(dp[i−1][j],dp[i−1][j−v]+w,dp[i−1][j−2v]+2w,⋯,dp[i−1][j−kv]+kw)\ dp[i][j]=max(dp[i−1][j],dp[i−1][j−v]+w,dp[i−1][j−2v]+2w,⋯,dp[i−1][j−kv]+kw) dp[i][j]=max(dp[i−1][j],dp[i−1][j−v]+w,dp[i−1][j−2v]+2w,⋯,dp[i−1][j−kv]+kw)
将左式的j\ j j替换成j−v\ j−v j−v后,得到 B式:
dp[i][j−v]=max(dp[i−1][j−v],dp[i−1][j−2v]+w,⋯,dp[i−1][j−kv]+(k−1)w)\ dp[i][j−v]=max(dp[i−1][j−v],dp[i−1][j−2v]+w,⋯,dp[i−1][j−kv]+(k−1)w) dp[i][j−v]=max(dp[i−1][j−v],dp[i−1][j−2v]+w,⋯,dp[i−1][j−kv]+(k−1)w)
仔细观察可以发现,A式从第二项开始与 B 式很相似,两者之间的差异仅为一个 w。
因此,将 A式右边第二项开始替换成 B 式加上一个 w 后,可得 C式:
dp[i][j]=max(dp[i−1][j],dp[i][j−v]+w)\ dp[i][j]=max(dp[i−1][j],dp[i][j−v]+w) dp[i][j]=max(dp[i−1][j],dp[i][j−v]+w)

在这里插入图片描述3. 完全背包问题

#include 
#include using namespace std;const int N = 1010;int n, m;
int v[N], w[N];
int f[N][N];//表示从前i个物品中选,总体积不超过j的方案的集合int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];for (int i = 1; i <= n; i ++ )//物品从第1件开始{for (int j = 0; j <= m; j ++ )//空间从0开始{f[i][j] = f[i-1][j];if( j >= v [i] ){f[i][j] = max(f[i-1][j], f[i][j - v[i]] + w[i]);//公式推导出来的}}}cout << f[n][m] << endl;return 0;
}

改成一维,如下:

#include 
#include using namespace std;const int N = 1010;int n, m;
int v[N], w[N];
int f[N];//不超过总体积j的方案的集合int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];for (int i = 1; i <= n; i ++ ){for (int j = v[i]; j <= m; j ++ ){//f[j] = f[j];  等式右边的f[j]表示 : 未更新前的,前i个物品中选,总体积不超过j的方案的集合 ; 等式左边表示更新后的 前i个物品中选,总体积不超过j的方案的集合。所以,与f[i][j] = f[i-1][j];等效f[j] = max(f[j], f[j - v[i]] + w[i]);//cout<

相关内容

热门资讯

【世界说】美国媒体2025年终...   中国日报网12月31日电 2025年即将画上句号。年终盘点虽然见仁见智,无法面面俱到,但美国主流...
强化平台治理 筑牢网络安全法治...   作者:赵精武(北京航空航天大学法学院副教授)  数字经济的繁荣发展离不开人工智能等关键技术的创新...
视频丨连续两年超1.4万亿斤!...   今年,全国粮食产量14297.5亿斤,比上年增加167.5亿斤,增长1.2%。这也是我国粮食产量...
转发提醒!这些食物千万不要隔夜...   元旦假期将至,无论是准备外出游玩,还是亲朋好友相聚,享受美食都是不可或缺的一部分。但如果吃多了、...
文博日历丨跨年彩蛋!美好的祝福...   今天的跨年夜怎么过?  仪式感拉满的“漂亮饭”  想必是点亮夜晚的最佳方式  三个看点带你认识 ...
不动产转让增值税计算解析 不动产转让增值税计算解析近期,一则关于不动产转让增值税计算的咨询案例引发业内广泛关注。该案例涉及酒店...
​小微企业残保金的免征期限是多... 小微企业残保金的免征期限是多久残保金的减免政策主要是基于对残疾人的特别扶助和保障其权利的实现,而非简...
同一控制下企业吸收合并税务处理... 导读本文详细解析同一控制下子公司吸收合并的税务处理要点,重点介绍A105100表的填报方法,帮助企业...
突发意外!韩国知名男演员被送I...   据媒体12月31日报道,韩国知名演员安圣基30日中午就餐时噎食,被送院紧急抢救,他目前在重症监护...
甘肃定西市漳县发生3.4级地震   速报参数: 据中国地震台网正式测定,12月31日17时3分在甘肃定西市漳县发生3.4级地震,震源...