学习目标:
https://www.luogu.com.cn/problem/P1077https://www.luogu.com.cn/problem/P1077
题解:
把所有花盆当做体积为1,价值为1的物品,每件物品有ai个,转换为多重背包问题。
注意:
- 将dp数组将二维压缩为一维后,放入0个第i个物品,应该f[j] = f[j] 而不是f[j] += f[j]。故k应当从1开始。
- f[j] += f[k] % mod时,只有f[k] 进行了取余操作,f[j] 不断加上f[k] % mod还是有可能越界,故写成f[j] = (f[j] + f[j - k]) %mod 相当于对f[j]进行取模,保证了不会越界。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110, mod = 1000007;
int f[N];
int main(){
int n, m;
cin >> n >> m;
memset(f, 0, sizeof f);
f[0] = 1;
for(int i = 1; i <= n; i ++){
int s;
cin >> s;
for(int j = m; j >= 0; j --){
//k从1 开始,若k等于零则与上层的方案相同,不能再加一次
//二维数组则无所谓
for(int k = 1; k <= min(s, j); k ++){
//这里写成f[j] += f[j-k] % mod;会导致f[j]越界
f[j] = (f[j] + f[j-k]) % mod;
}
}
}
cout << f[m] % mod;
return 0;
}