洛谷 P1077. 摆花 --多重背包变形
本题是多重背包变形 对每种花的数量作了限制
遇到的坑
刚开始只能通过一般数据 因为在代码的中间部分没有对答案进行取模 只对输出答案时取了模 显然中间对答案赋值时就可能溢出 导致答案产生负数
所以以后做题一定要注意 当题目要求取模时 中间部分也一定要取模 防止某一环节对答案进行运算时就溢出了
有时也要求对答案在运算的时候强转成long long
#include <bits/stdc++.h>
using namespace std;
const int N = 110, mod = 1e6 + 7;
long long f[N][N];
int a[N];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n + 1; i ++ ) f[i - 1][0] = 1;
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
for (int k = 0; k <= j && k <= a[i]; k ++ )
{
f[i][j] += f[i - 1][j - k] % mod;
}
}
}
printf("%lld\n", f[n][m] % mod);
return 0;
}
这道题可以用滚动数组的方式去优化 因为这里每个物品的价值都是1 不会存在完全背包模板题中多余项的问题 但为了通用性 这里就不上一维代码了

浙公网安备 33010602011771号