不能用常规的状态转移方程,因为会出现重复。
解决方法是利用买书的种类来限制
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <math.h>
#include <stack>
#include <ctype.h>
using namespace std;
int N;
int dp[1005];
int price[4] = {1,2,5,10};
int main()
{
cin >> N;
if( (N%10) != 0 || N==0)
cout << 0 <<endl;
else
{
N /= 10;
dp[0] = 1;
for( int k = 0; k <= 3; k++ )
{
for( int i = 1; i <= N; i++ )
{
if( i >= price[k] )
dp[i] += dp[i-price[k]];
}
}
cout << dp[N] <<endl;
}
return 0;
}