2026/4/6 2:20:33
网站建设
项目流程
家居东莞网站建设,wordpress配置域名,常见的网站开发环境,h5做的网站有哪些#x1f9f3; 背包问题详解#xff08;0/1 背包、完全背包、多重背包#xff09;——附 C 实现
一、什么是背包问题#xff1f;
背包问题#xff08;Knapsack Problem#xff09; 是经典的动态规划问题之一#xff1a;给定一个容量有限的背包和若干物品#xff0c;每个… 背包问题详解0/1 背包、完全背包、多重背包——附 C 实现一、什么是背包问题背包问题Knapsack Problem是经典的动态规划问题之一给定一个容量有限的背包和若干物品每个物品有体积或重量*和*价值问如何选择物品使得总价值最大**。根据每个物品可选次数不同背包问题主要分为0/1 背包每个物品最多选一次完全背包每个物品可以选无限次多重背包每个物品有固定数量二、0/1 背包问题1️⃣ 问题描述背包容量W物品数量n第i个物品重量w[i]价值v[i]每个物品最多选一次目标 在不超过背包容量的前提下使总价值最大。2️⃣ 状态定义令dp[j] 容量为 j 时能获得的最大价值3️⃣ 状态转移方程对于第i个物品dp[j] max(dp[j], dp[j - w[i]] v[i])⚠️关键点j必须从大到小遍历防止一个物品被选多次。4️⃣ C 实现0/1 背包#includebits/stdc.husingnamespacestd;intmain(){intn,W;cinnW;vectorintw(n),v(n);for(inti0;in;i){cinw[i]v[i];}vectorintdp(W1,0);for(inti0;in;i){for(intjW;jw[i];j--){dp[j]max(dp[j],dp[j-w[i]]v[i]);}}coutdp[W]endl;return0;}三、完全背包问题1️⃣ 问题描述与 0/1 背包类似但每个物品可以选无限次2️⃣ 状态转移区别dp[j] max(dp[j], dp[j - w[i]] v[i])⚠️关键区别j必须从小到大遍历允许多次使用当前物品。3️⃣ C 实现完全背包#includebits/stdc.husingnamespacestd;intmain(){intn,W;cinnW;vectorintw(n),v(n);for(inti0;in;i){cinw[i]v[i];}vectorintdp(W1,0);for(inti0;in;i){for(intjw[i];jW;j){dp[j]max(dp[j],dp[j-w[i]]v[i]);}}coutdp[W]endl;return0;}四、多重背包问题1️⃣ 问题描述每个物品最多只能选k[i]次2️⃣ 常见解决方法✅ 方法一暴力枚举不推荐三重循环时间复杂度高。✅ 方法二二进制拆分推荐将k个物品拆成1, 2, 4, ..., 剩余然后转化为0/1 背包问题。3️⃣ C 实现二进制优化#includebits/stdc.husingnamespacestd;intmain(){intn,W;cinnW;vectorintdp(W1,0);for(inti0;in;i){intw,v,k;cinwvk;for(intc1;k0;c1){intnummin(c,k);k-num;intweightnum*w;intvaluenum*v;for(intjW;jweight;j--){dp[j]max(dp[j],dp[j-weight]value);}}}coutdp[W]endl;return0;}五、三种背包对比总结类型每件物品j 遍历方向本质0/1 背包最多 1 次从大到小防止重复选完全背包无限次从小到大允许重复多重背包有上限转化为 0/1二进制优化