这道题是完全背包问题求方案数,我们给出 f[i][j] 所表示的集合:所有考虑前 i 个物品,总体积恰好为 j 的不同选择,属性为选择的总和,即方案数
对于不选第 i 个物品,有:f[i][j]=f[i−1][j]
对于选第 i 个物品,有:f[i][j]=f[i−1][j−v]+f[i−1][j−2v]+f[i−1][j−3v]+⋯+f[i−1][j−sv]
整体就是 f[i][j]=f[i−1][j]+f[i−1][j−v]+f[i−1][j−2v]+f[i−1][j−3v]+⋯+f[i−1][j−sv]
与一般完全背包不同的是,求方案数是将前面所有的状态加起来
往后写一位,有:f[i][j−v]=f[i−1][j−v]+f[i−1][j−2v]+f[i−1][j−3v]+⋯+f[i−1][j−sv]
即 f[i][j]=f[i−1][j]+f[i][j−v]
这里的 v 指的是体积,本题中指的是书的价格
完整代码:
#include <iostream>
using namespace std;
const int N = 1010;
int f[N];
int v[5] = {0, 10, 20, 50, 100};
int n;
int main()
{
cin >> n;
f[0] = 1;//对于这种恰好的定义,一定要记得初始化
for(int i = 1; i <= 4; i++)
for(int j = v[i]; j <= n; j++)
f[j] = f[j] + f[j - v[i]];
cout << f[n] << endl;
return 0;
}