描述
输入
一个整数 n,代表总共钱数。(0 <= n <= 1000)
输出
一个整数,代表选择方案种数
样例输入
样例输出
小明手里有n元钱全部用来买书,书的价格为10元,20元,50
问小明有多少种买书方案?(每种书可购买多本)
样例输入1:20
样例输入2:15
样例输入3:0
样例输出1:2
样例输出2:0
样例输出3:0
题目要求输入一个数用四种数分解,有几种方法;
思路如下:
f[n][i]代表前n种书用i元钱买有几种方法;
建立循环从10元开始计算;
那么最后一本书如果是x,f[n][i]=[n-1]f[i]+f[n-1][i-x];
利用滚动数组转化为一维数组计算;
代码如下:
#include<bits/stdc++.h>
using namespace std;
int f[105]={1};
int dp(int x)
{
int i,k,a[4]={1,2,5,10}; //四种书的价格
for(k=0;k<4;k++)
{
for(i=1;i<=x;i++)
{
if(i>=a[k])
f[i]+=f[i-a[k]]; //如果可以买得起就加一个
}
}
return f[x];
}
int main()
{
int n;
cin>>n;
if(n==0)
cout<<0<<endl; //总钱数为0输出0
else if(n%10!=0)
{
cout<<0<<endl; //没法被10整除得不到结果
}
else
{
cout<<dp(n/10)<<endl;
}
}