数字组合(01背包问题求方案数)

该博客探讨了如何利用01背包问题的思路解决从一组正整数中选择若干数使得和等于特定值的方案数问题。通过状态表示和状态转移,将问题转化为动态规划,并给出了完整的代码实现。
摘要由CSDN通过智能技术生成

给定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

思路:

这个问题可以转化为:从n件物品(数字)中选若干个,使之和恰好为为m的方案个数,每个数都是只有选和不选两种决策,显然可以把这个问题看作一个01背包求方案数的问题,从状态表示和状态计算两方面分别分析:

状态表示:集合:用f[i,j]表示选前i个物品,且体积恰好为j的方案,维护的属性为count(个数)。

状态计算等价于集合划分的过程,将f[i,j]按照最后一个物品(当前的i)选和不选,可以划分为两块,一块为选第i件,另一块为不选第i件。

不选第i件:f[i,j]=f[i-1,j]

选第i件:f[i,j]=f[i-1,j-vi](vi表示当前第i个数的数值,选第i件之后会有两部分构成,因为是求方案数,因此两部分是一个方案,方案数等价,所以只分析去掉地i件的前一部分的方案数即可)

因此,最后f[i,j]=f[i-1,j]+f[i-1,j-vi],可以发现转态转移中当

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值