首页 > 其他分享 >动态规划——完全背包问题

动态规划——完全背包问题

时间:2023-03-28 17:15:39浏览次数:25  
标签:背包 weight int value new 动态 规划 dp

完全背包问题一般是指:

有N件物品和一个能背重量为W的背包,第i件物品的重量为weight[i],价值为value[i]。每件物品有无限个(也就是可以放入背包多次),求怎样可以使背包物品价值总量最大。

完全背包与01背包问题的区别在于01背包物品只有一个,完全背包有无数个。

1、原始朴素算法:

dp[i][j] 的状态表示:①集合:表示前i个物品中,总体积不超过j的选法的物品价值最大值    ②属性:当前情况下的最大值

dp[i][j] 的状态计算:当前的第i个物品,可以选任意多个(总体积不超过背包容量)。那么就枚举呗,从选0个到选k个枚举,dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i],dp[i-1][j-2*weight[i]]+2*value[i],......,dp[i-1][j-k*weight[i]]+k*value[i])    (※)

朴素代码:

#include<iostream>
using namespace std;
int main(){
    int n,cap;
    cin>>n>>cap;
    int *v=new int[n];
    int *w=new int[n];
    for(int i=0;i<n;i++){
        cin>>v[i]>>w[i];
    }
    int **dp=new int*[n+1];
    for(int i=0;i<=n;i++){
        dp[i]=new int[cap+1];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=cap;j++){
            for(int k=0;k*v[i-1]<=j;k++){
                dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i-1]]+k*w[i-1]);
            }
        }
    }
    cout<<dp[n][cap];
    return 0;
}

朴素算法有三重循环,我们现在将其优化成二重循环,原理如下:

上面的(※)式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i],dp[i-1][j-2*weight[i]]+2*value[i],......,dp[i-1][j-k*weight[i]]+k*value[i])

则dp[i][j-weight[i]]可按此公式推得(※1):dp[i][j-weight[i]]=max(dp[i-1][j-weight[i]],dp[i-1][j-2*weight[i]]+value[i],dp[i-1][j-3*weight[i]]+2*value[i],......,dp[i-1][j-k*weight[i]]+(k-1)*value[i])

可以观察到,(※)的加粗部分和(※1)的加粗部分大致相同,只是(※)的加粗部分每项多加一个value[i](每项都加,等于没加,最大值还是那一项,只是值不同),也就是说(※1)的最大值比(※)的最大值多了一个value[i]。

那么便可以把(※1)带入(※)中,让表达式更加简洁一些,(※)改进得:

dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i])   (核心)

2、优化成双层循环的算法:

#include<iostream>
using namespace std;
int main(){
    int n,cap;
    cin>>n>>cap;
    int *v=new int[n];
    int *w=new int[n];
    for(int i=0;i<n;i++){
        cin>>v[i]>>w[i];
    }
    int **dp=new int*[n+1];
    for(int i=0;i<=n;i++){
        dp[i]=new int[cap+1];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=cap;j++){
            dp[i][j]=dp[i-1][j];
            if(j>=v[i-1])dp[i][j]=max(dp[i][j],dp[i][j-v[i-1]]+w[i-1]);
        }
    }
    cout<<dp[n][cap];
    return 0;
}

3、继续优化成一维dp数组的算法:

#include<iostream>
using namespace std;
int main(){
    int n,cap;
    cin>>n>>cap;
    int *v=new int[n];
    int *w=new int[n];
    for(int i=0;i<n;i++){
        cin>>v[i]>>w[i];
    }
    int *dp=new int[cap+1];
    for(int i=1;i<=n;i++){
        for(int j=v[i-1];j<=cap;j++){
            dp[j]=max(dp[j],dp[j-v[i-1]]+w[i-1]);
        }
    }
    cout<<dp[cap];
    return 0;
}

 4、小结:

优化成一维的与01背包的状态转移方程对比,仅仅微小的区别,但是背后含义千差万别:

01背包:dp[i][j]= max(dp[i-1][j],dp[i-1][j-w]+v)

完全背包:dp[i][j]=max(dp[i-1][j],dp[i][j-w]+v)

这个微小的区别,导致了一维空间时,01背包是从后向前遍历(防止左边的数,即含义上是上一层的数被修改覆盖),完全背包是从前向后遍历(需要这一层前面的数)。

标签:背包,weight,int,value,new,动态,规划,dp
From: https://www.cnblogs.com/Pworldlet/p/16543728.html

相关文章

  • 2012第36周国内Android应用下载动态
    本周Android应用下载动态:主要是来自GooglePlay官方市场和国内包括安卓市场、91手机助手、腾讯应用宝、搜狐应用中心以及网易应用中心等17家第三方市场在内的一共18家应用市......
  • 什么叫动态页面和静态页面?
    静态页面是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页。静态页面不能自主管理发布更新的页面,如果想更新网页内容,要通过FTP软件把文......
  • 一行代码搞定Android 6.0动态权限申请
    1、前言从Android6.0(API23)开始,对系统权限做了很大的改变。在之前用户安装APP前,只是把APP需要使用的权限列出来给用户告知一下,APP安装后都可以访问这些权限。从6.0开始,一......
  • 动态规划法
    概述动态规划在计算机科学领域,成为一种通用的算法设计技术用来求解多阶段决策最优化问题最优化问题有n个输入,问题的解由这n个输入的一个子集组成,这个子集必须满足某......
  • HJ41_称砝码_动态规划_双层循环的内层循环对象同时更新(巧妙)
    思路:陈砝码也就是砝码有多少种组合方式。1.用穷举方法,但是操作量大,且同一重量可以有多重不同砝码称取方式。2.用确定砝码称取范围(0,max_weight),并逆推组合是否成立的方式,可......
  • 动态组件
    动态组件动态组件:动态切换组件的显示与隐藏通过两个按钮,进行Left和Right两个组件的切换通过keep-aliveinclude和exclude进行组件的选择缓存还是不缓存而keep-alive有......
  • 代码随想录算法训练营Day55 动态规划
    代码随想录算法训练营代码随想录算法训练营Day55动态规划|392.判断子序列115.不同的子序392.判断子序列题目链接:392.判断子序列给定字符串s和t,判断s是否为t......
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划
    DAY4共2题:树(组合数学)子序列(dp,数学)......
  • SpringBoot多数据源(自定义注解,动态数据源,事务实现)
    一、数据库配置文件(这里用的是阿波罗配置中心,也可以是application.yml文件)#mysql本地数据源1spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driverspr......
  • Stevie出怪招:把动态新闻搬到TV大屏幕
    想不想把Facebook,Twitter新闻动态像看电视那样呈现出来?创业公司 Stevie今天就推出了这样一款产品,只要把它安在iPhone或Android手机上,你可以通过手机遥控把新闻动态呈现在T......