总时间限制: 1000ms
内存限制: 65536kB
描述
小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。
问小明有多少种买书方案?(每种书可购买多本)
输入
一个整数 n,代表总共钱数。(0 <= n <= 1000)
输出
一个整数,代表选择方案种数
样例输入
样例输入1:
20
样例输入2:
15
样例输入3:
0
样例输出
样例输出1:
2
样例输出2:
0
样例输出3:
0
解题思路
定义dp[i][j]为在前i种书中购买,总价为j元的方案数。
在前i种书中购买总价为0元,就是不购买,所以dp[i][0]=1
定义a[i]为第i本书的售价。
一、若选择一本第i种书,然后在前i种书中选择,总价为j-a[i],方案数为dp[i][j-a[i]]
二、若不选择第i种书,然后在前i-1种书中选择,总价为j的方案数,方案数dp[i-1][j]
将两种情况的方案数加和,为前i种书种购买总价为j元的方案数。
所以dp[i][j] = dp[i][j-a[i]] + dp[i-1[j]
解题代码
#include<bits/stdc++.h>
using namespace std;
#define N 15
#define M 1005
int n, m, a[N] = {0, 10, 20, 50, 100};
int dp[N][M];
{
m = 4;
cin >> n;
for(int i = 0; i <= m; ++i)
dp[i][0] = 1;
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= n; ++j)
{
if(j >= a[i])
dp[i][j] = dp[i][j-a[i]] + dp[i-1][j];
else
dp[i][j] = dp[i-1][j];
}
cout << dp[m][n];
return 0;
}