小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。
问小明有多少种买书方案?(每种书可购买多本)
输入格式
一个整数 n,代表总共钱数。
输出格式
一个整数,代表选择方案种数。
经典的完全背包问题
每一种物品可以买多个,但是总价钱不能超过n
状态表示:
(1)集合:从第i个物品中选,总价钱恰好为j的方案数
(2)属性:方案数
状态计算:
(1)不选i
(2)选一个i
(3)选两个i
以此类推
到第s个
因此总的方案数就是所有的情况的总和,然后可以优化计算的状态转移方程
因此综合两个式子,可以得出
注意当 j = 0 时,都不选也是一种方案
因此可以得出代码
#include<iostream>
using namespace std;
const int N = 1010;
int n;
int a[5] = {0 , 10 , 20 , 50 , 100};
int f[N];
int main()
{
cin >> n;
f[0] = 1;
for(int i = 1;i <= 4;i ++)
for(int j = a[i];j <= n;j ++)
f[j] += f[j - a[i]];
cout << f[n];
return 0;
}