2.7动态规划的背包问题

开心的金明

以前从没用这种做法做过题,看题解差不多看了两个小时,然后自己一步步的推过程才最终明白,ac代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[25],b[25],f[30000];
int maxx(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;++i)
        cin>>a[i]>>b[i];
    for(int i=1;i<=m;++i)
        for(int j=n;j>=a[i];--j)
            f[j]=maxx(f[j],f[j-a[i]]+a[i]*b[i]);
    cout<<f[n];
    return 0;
}

小A点菜

这题是DP入门的好题,属于01背包,其实就是考察了大家对dp标准打法的熟练度。

由题意可以得到我们的状态转移f[i]+=f[j-v[i]]

具体详情可以看看代码

#include<bits/stdc++.h>
using namespace std;
int a[101],f[10001];
int main()
{
    int n,m;
    cin>>n>>m;
    f[0]=1;
    for(int i=1;i<=n;++i)
        cin>>a[i];
    for(int i=1;i<=n;++i)
        for(int j=m;j>=a[i];--j)
            f[j]+=f[j-a[i]];
    cout<<f[m];
    return 0;
}
金明的预算方案
这一题具体的解法我还没有明白 待仔细看过再补注释

这是一道分组背包的典型例题 

附大佬注释及代码

这是一道需要转化的分组背包问题。如在每组中只能取1个,只需用dp[i][j]表示前i组中w不超过j的最优解,每次在每组中选取最优解即可

用物品组的思想考虑题中极其特殊的依赖关系:物品不能既作主件又作附件,每个主件最多有两个附件,可以发现一个主件和它的两个附件等价于一个由四个物品组成的物品组,从而用分组背包问题求解。(Note:发现问题中数据间关系的特殊性)

小技巧:发现数据均为10的倍数时,影响到先将所有数除以10,最后再乘10,从而时间复杂度和空间复杂度均缩小10倍!(发现问题特点)

初始化时寻找最简便的模式

当vector.size()在循环中会改变时,循环条件的终止一定不能写size(),要在循环前先取出!

#include <bits/stdc++.h>
using namespace std;
struct solu
{
    int w,v;
    solu(int nw, int nv){w=nw;v=nv;} //构造函数 
};
vector<solu> a[65];
int n,m,dp[32005];
map<int,int> mp;
int main()
{
    cin >> n >> m;n/=10;  //小技巧,时间复杂度和空间复杂度缩小10倍! 
    int k=0;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin >> x >> y >> z;x/=10;
        if(z==0)  //分类处理 
        {
            k++;
            a[k].push_back(solu(x,x*y));
            mp[i]=k;
        }
        else
        {
            int len=a[mp[z]].size();  //这里一定要先把size取出来,在添加过程中size会不断增加!!! 
            for(int j=0;j<len;j++) a[mp[z]].push_back(solu(x+a[mp[z]][j].w,x*y+a[mp[z]][j].v)); //较简便的初始化模式
        }
    }
    for(int i=1;i<=k;i++)  //分组背包 
    {
        for(int j=n;j>=0;j--)
        {
            for(int q=0;q<a[i].size();q++)
            {
                if(j>=a[i][q].w) dp[j]=max(dp[j],dp[j-a[i][q].w]+a[i][q].v); //选取每组的最优解 
            }
        }
    }
    cout << dp[n]*10; //结果一定要记得乘10 
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值