动态规划——完全背包问题(C++实现)
创始人
2024-02-06 02:11:11
0

题目描述:

在这里插入图片描述

问题分析:

完全背包问题和01背包问题的不同点:

简单01背包中是从N个物品里选,每个物品只能用1次,完全背包则不同,每个物品可以用无限次。

01背包:

如果物品能放入背包( j>=v[i])则动态转移方程为 :
dp[i][j]=max( dp[i-1][j],dp[i-1][ j-v[i] ]+ w[i] ),
如果物品不能放入背包(j dp[i][j]=dp[i-1][j]

完全背包:

动态转移方程满足:dp[i][j]=max{dp[i-1][ j-k×v[i] ] + k×w[i]},其中 0 ≤ k×v[i] ≤ j
可以发现,当k只能取0、1时的特例就是简单的0-1背包问题。

可以发现,选0次,即不选是肯定存在的,dp[i][j]=dp[i-1][j];
然后选1次,那就不一定存在了,可能可以选,也可能不可以选,假设可以选,在选0次该物品求出dp[i][j]的基础上,确定是否选该物品:if (j>=v[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
选2次、选3次,依次类推,一直到选k次。

代码和注释:

#include 
#define read(x,y) scanf("%d%d",&x,&y)
using namespace std;int v[1010],w[1010];
int dp[1010][1010];//N行V列,0行0列初始为0int main() 
{int N,V;//读入物品种类N和背包体积Vread(N,V);//读入各个物品所占的体积和拥有的价值for (int i=1;i<=N;i++) read(v[i],w[i]);for (int i=1;i<=N;i++)for (int j=0;j<=V;j++)//迭代k次for (int k=0;k*v[i]<=j;k++)dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]);printf("%d",dp[N][V]);return 0;
}

结果展示:

在这里插入图片描述

进一步优化,参看:

https://blog.csdn.net/HangHug_L/article/details/114238728

相关内容

热门资讯

欢乐过暑假,安全健康不放假 |...   暑假期间,孩子们宅家吃喝、外出玩乐时,如何做好安全防护,避免意外伤害?关于暑假期间安全与健康的几...
事关“地下生命”,有新发现!   研究显示:地震可为“地下生命”提供“燃料”  一项最新研究显示,地震等地壳内部构造活动瞬间释放的...
俄媒首次公开攻击型无人机生产基...   当地时间7月20日,俄罗斯红星电视台首次曝光位于俄联邦鞑靼斯坦共和国境内的一个无人机生产基地。这...
旅客突发疾病呕吐晕厥 特警队员...   7月2日,一位乘客在T307列车兰州到西宁路段突发疾病晕厥,患者口鼻被分泌物堵塞,无法进行自主呼...
狭窄山路惊现“拦路石” 正要倒...   近日,贵州毕节,狭窄山路惊现“拦路石”,正要倒车避让对向车结果垮塌,网友:是你的善良救了你。(编...
最新报告!179人遇难!韩国空...   据环球网援引韩国《朝鲜日报》21日报道,韩国国土交通部下属航空与铁路事故调查委员会(ARAIB)...
11.23亿!你是其中之一   新华社权威快报|我国网民规模达11.23亿人  海报制作:胡戈  中国互联网络信息中心7月21日...
国家航天局:商业航天项目承担方...   中新网7月21日电 据国家航天局网站消息,7月21日,国家航天局发布《关于加强商业航天项目质量监...
(辉煌60载 魅力新西藏)一个...   中新网西藏那曲7月20日电(记者 程小路)今年5月,西藏那曲市比如县白嘎乡的冬虫夏草(以下简称“...
焦点访谈丨全国多地进入“烧烤”...   7月20日,我国正式进入了今年的三伏天。对于高温,最近这些天我国部分地方已经开启“烧烤”模式,很...