注意这题中的钱必须花完,因此体积限制是恰好是V。
书看成物品,书的价格就是体积,购买书的本数是价值。
考虑第i个物品,两种情况:取和不取
不取的方案数:f[i-1, j]
取的方案数:f[i-1, j-v] + f[i-1, j-2v] + f[i-1, j-3v] + ...
取和不取的方案求和就是f[i, j]
f[i, j] = f[i-1, j] + f[i-1, j-v] + f[i-1, j-2v] + f[i-1, j-3v] + ...
观察f[i, j]
和f[i, j-v]
的递推式
递推式1:f[i, j] = f[i-1, j] + f[i-1, j-v] + f[i-1, j-2v] + f[i-1, j-3v] + ...
递推式2:f[i, j-v] = __________f[i-1, j-v] + f[i-1, j-2v] + f[i-1, j-3v] + ...
将递推式2带入递推式1得到
f[i, j] = f[i-1, j] + f[i, j-v]
体积限制是恰好是,因此需要初始化f[0][0]为合法解1,其他位置为非法解0。此外还需根据题目特判n=0,买书方案是0。
#include <iostream>
using namespace std;
int n, f[1005];
int v[5] = {10, 20, 50, 100};
int main() {
scanf("%d%", &n);
f[0] = 1;
for (int i = 0; i < 4; i++) {
for (int j = v[i]; j <= n; j++) {
f[j] = f[j] + f[j - v[i]];
}
}
if (n == 0) printf("0\n");
printf("%d\n", f[n]);
return 0;
}