首页 > 其他分享 >背包问题求方案数

背包问题求方案数

时间:2024-03-04 14:48:14浏览次数:12  
标签:方案 背包 int 中选 问题 体积 include

1. \(01\) 背包求恰好装满方案数

f[i][j]: 从前i个物品中选,体积正好为j的方案数
状态转移方程和 \(01\) 背包问题求最大价值是一样的

朴素版

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 10010;

int n, m, v[N];
int f[N][M];

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ )   cin >> v[i];
    
    // 从前i个物品中选,体积正好为0的方案数是0
    for(int i = 0; i <= n; i ++ )   f[i][0] = 1;
    
    for(int i = 1; i <= n; i ++ )
    {
        for(int j = 1; j <= m; j ++ )
        {
            // 不选
            f[i][j] = f[i - 1][j];
            // 选
            if(j - v[i] >= 0)    f[i][j] += f[i - 1][j - v[i]];
        }
    }
    
    cout << f[n][m] << endl;
    
    return 0;
}

优化版

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 10010;

int n, m, v[N];
int f[M];

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ )   cin >> v[i];
    
    // 从前i个物品中选,体积正好为0的方案数是0
    f[0] = 1;
    
    for(int i = 1; i <= n; i ++ )
        for(int j = m; j >= v[i]; j -- )
            f[j] += f[j - v[i]];
    
    cout << f[m] << endl;
    
    return 0;
}

2. 完全背包求恰好装满方案数

f[i][j]: 从前i个物品中选,体积正好为j的方案数
但要注意,它的状态转移方程和完全背包求最大价值是不一样的
完全背包求最大价值是 f(i,j) = max(f(i-1,j), f(i-1,j-v)+w, f(i-1,j-2v)+2w,..., f(i-1,j-kv)+kw);
然后通过替换写为 f(i,j) = max(f(i-1,j), f(i,j-v));
但我们这里求方案数不可以写为 f(i,j) = f(i-1,j) + f(i,j-v);
因为求最大价值取得是 \(MAX\),而求方案数取得是 SUM
也就是说,在这里应为f(i,j) = sum(f(i-1,j), f(i-1,j-v)+w, f(i-1,j-2v)+2w,..., f(i-1,j-kv)+kw);

标签:方案,背包,int,中选,问题,体积,include
From: https://www.cnblogs.com/ALaterStart/p/18051749

相关文章

  • 线上问题记录:因闰年导致的数据查询错误
    在今天的生产环境测试中,测试发现几个数据页面显示为空白。反馈给开发后,通过查看相关接口和后台日志,发现某个查询SQL出现了问题,错误信息如下:此查询功能的前后端近期没有改动,排除是改动造成的。从日志上看,导致错误的原因是无效的时间查询参数20230229。结合业务分析,我们需要查......
  • UniDateTimePicker日期转换问题---“2024-03-05” is not a date and time
    这个问题是由于操作系统的日期格式与用StrToDate给UniDateTimePicker.dateTime赋值格式不一致造成的。注意:这个问题在使用UniGui的Standalone模式下没问题,在Windowsservice模式下会出现上述问题。可以在系统的主程序中设置一下系统日期格式:procedureSetDateTimeFormat();var......
  • UnicheckBox左侧选择框显示问题!!!
    UnicheckBox左侧选择框有时显示、有时不显示,是一个BUG啊。试了后发现,改变一下程序uses列表顺序,可解决这个问题:unitabcc;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,DateUtils,uniPanel,uniGUIBaseClasses,uniGUIFrame,uni......
  • python -- 解决安装pyxll-jupyter时出现“TimeoutError: The read operation timed ou
     在cmd输入命令”pipinstallpyxll-jupyter“进行安装,控制台出现以下报错信息:Downloadingpyxll_jupyter-0.5.2-py3-none-any.whl(46kB)----------------------------------------46.3/46.3kB16.1kB/seta0:00:00Downloadingjupyter-1.0.0-py2.py3-none-any.whl......
  • File name too long 的bug,File name too long,文件名过程,文件路径问题
    首先,先说一下遇到问题的背景;我们公司需要上报一些文件,不限制格式;而且对于大于50M的文件pdf,压缩包等必须拆分和重命名;从开发到测试和目前的运行一直没有问题;最近在正常下载和上报时发现了个别文件没有下载下来;通过排查日志发现报下面的错; 原来是文件名太长了,通过查询资料了解到......
  • Net7升级到Net8相关问题
    除了按照网上常规Net8升级步骤外,编译和运行都会发生一些异常和错误,代码兼容性根据提示倒是可以修改。倒是运行时错误,网上资料比较少,下面会持续登记升级过程中踩的坑:1. MediatR库升级到最新的12.2后,报错各种服务找不到,实际是没有DI实现:原来注册一般这么写:1services.AddMedia......
  • 技术实践|数据迁移中GBK转UTF8字符集问题分析
    导语:在国产化创新的大背景下,数据库迁移项目逐渐增多,在数据库迁移过程中,源数据库和目标数据库字符集有时会不同,这时如何进行字符集转换则成为了一个重要的问题,同时在转换过程中还需要确保数据的完整性和一致性。 字符集转换算法是一个复杂的领域,因此各个操作系统和库实现可能会......
  • 数组问题集合--更新中
    1.多个数组长度相加constarrays=[[1,2],[3,4],[5]];//示例数组//使用reduce()函数将所有数组的长度求和constsumOfLengths=arrays.reduce((accumulator,currentArray)=>accumulator+currentArray.length,0);console.log(sumOfLengths);//输出结果为6([......
  • uniapp开发微信小程序,动态排列组件的解决方案。
    微信小程序开发里面,并不支持<component:is="item",虽然微信小程序提供了WXML提供模板(template),对于uniapp并不管用,编译后,所以解决方案,只有目前(截止2022-04-15)只有两个:1.使用v-if,遍历组件,判断位置,来显示组件,达到排列要求2.第二种没那么麻烦,比较神奇,使用flex布局的order属性,外层......
  • k8s有关问题
    1.pod报错:unabletoensurepodcontainerexists:failedtocreatecontainerfor[kubepodsburstablepod7e45f702-c697-4b39-b34b-db8792445622]:mkdir/sys/fs/cgroup/memory/kubepods/burstable/pod7e45f702-c697-4b39-b34b-db8792445622:cannotallocatememory解决:......