题意
给出NN个数,选出其中若干个使得它们的和是,求方案数。
思路
0/1背包的模型。我们可以把NN个数看成个物品,MM就是背包的乘积,然后用0/1背包的动态转移方程中的改成累加就好了:
f[j]+=f[j−ai](m≥j≥ai)f[j]+=f[j−ai](m≥j≥ai)
代码
#include<cstdio>
int f[10001],n,m,a[101];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
f[0] = 1;
for (int i = 1; i <= n; i++)
for (int j = m; j >= a[i]; j--)
f[j] += f[j - a[i]];
printf("%d", f[m]);
}
本文介绍了一种解决0/1背包问题的方法,通过动态规划实现,具体为计算给定一组数值,如何选择这些数值使得其总和恰好等于目标值M。文中详细解释了动态转移方程的调整,并提供了完整的C++代码实现。
1191

被折叠的 条评论
为什么被折叠?



