洛谷 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 不会存在完全背包模板题中多余项的问题 但为了通用性 这里就不上一维代码了

posted @ 2024-04-16 17:13  MsEEi  阅读(21)  评论(0)    收藏  举报