01背包简单问题 数字组合

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01背包简单问题 数字组合相关的知识,希望对你有一定的参考价值。

给定 N 个正整数 A1,A2,…,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案。

输入格式
第一行包含两个整数 N 和 M。
第二行包含 N 个整数,表示 A1,A2,…,AN。

输出格式
包含一个整数,表示可选方案数。

数据范围
1≤N≤100,
1≤M≤10000,
1≤Ai≤1000
输入样例:
4 4
1 1 2 2
输出样例:
3

  • 这题是01背包问题

  • 注意设置初始值
    f[0]从前0个数选,数字总和为0的方案数为1

  • 此处采用滚动数组的方法

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int f[N],a[105];

int main()
{
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    f[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=a[i];j--)
            f[j] = f[j]+f[j-a[i]];
    }
    cout<<f[m]<<'\\n';
    return 0;
}

以上是关于01背包简单问题 数字组合的主要内容,如果未能解决你的问题,请参考以下文章

CH5201 数组组合01背包

Acwing-278-数字组合(背包)

背包问题 codevs2210 数字组合

动态规划的背包问题《数字组合》

01背包思想解决组合问题并输出组合

动态规划_01背包_完全背包_多重背包_分组背包