背包问题

背包问题写过很多,今天又遇到了结果忘记怎么搞了,其实一系列相关的动规也不太会,不过背包还算是有模板。稍微记录一下。

01背包问题:有N件物品和一个容量为V的背包。第i件物品的费用是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。

复制代码
 1 /*
 2 背包内的价值可以设置一个二维数组ans[i][j]
 3 表示前i件物品恰放入一个容量为j的背包可以获得的最大价值
 4 不放入-> ans[i-1][j]
 5 放入-> ans[i-1][j-对应物品的重量]+对应物品的价值
 6 */
 7 for(int i=1;i<=n;i++)//背包的每个物体都走一遍流程
 8     for(int c=m;c>=0;c--)//c模拟背包的容量m 遍历每一个背包容量情况
 9         if(c>=w[i])//如果装得下当前的i物品
10             f[c]=max(f[c],f[c-w[i]]+v[i]);//则加上价值i对比并更新最优决策
复制代码

 

完全背包问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

01背包的变种其一,唯一的区别就是每个物品都是无限可用了。对于每件的物品决策除了取1件或者不取,可以衍生出取2件,取3件...但是状态转移方程是一样的

但是01背包是倒序的,完全背包则是正序的。考虑正序的本质实际上是在考虑“加选某个物品”,比较的是之前的子结果的情况下加选的新结果。

for(int i=1;i<=n;i++)
    for(int c=0;c<=m;c++)//背包的容量变成了正序,其余的没有变化
        if(c>=w[i])
            f[c]=max(f[c],f[c-w[i]]+v[i]);

 

多重背包问题:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

01背包的变种其二,把物品复制成N份,还是原来的01背包。在选取物品的决策上加个取多少的系数。

for(int i=1;i<=n;i++)
    for(int c=m;c>=0;c--)
        for(int k=1;k<=n[i]&&j-k*w[i]>=0;k++)//多设置一个取件系数k
            f[c]=max(f[c],f[c-w[i]*k]+v[i]*k);

 

混合背包问题:将0-1背包、完全背包、多重背包混合起来。有的物品只可以取一次,有的物品可以取无限次,有的物品可以取的次数有一个上限。缝合怪背包问题

总感觉这种背包问题是在整活一样,实际上的解法是把之前的解法结合起来,事先区分具体是哪种背包,然后再丢一起

复制代码
for(int i=1;i<=n;i++)
{
    if(是01背包)
    {
        for(int j=V;j>=w[i];j--)
            f[j]=max(f[j],f[j-w[i]]+v[i]);
    }
    else if(是完全背包)
    {
        for(int j=w[i];j<=V;j++)
            f[j]=max(f[j],f[j-w[i]]+v[i]);
    }    
    else是多重背包 
    {
        for(int j=V;j>=w[i];j--)
            for(int k=1;k<=p[i]&&j-k*w[i]>=0;k++)
                f[j]=max(f[j],f[j-w[i]*k]+v[i]*k);
    }
}
复制代码

 

posted @   anesu  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示