其实是很简单的背包问题,但是一开始不小心忘了看条件。
题目要求的是到达给定的价值,使用的硬币不超过100枚的情况下,总路径。。。
/******************************************************************************* # Author : Neo Fung # Email : [email protected] # Last modified: 2012-06-13 16:07 # Filename: acm.cpp # Description : ******************************************************************************/ #ifdef _MSC_VER #define DEBUG #define _CRT_SECURE_NO_DEPRECATE #endif #include <fstream> #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <limits.h> #include <algorithm> #include <math.h> #include <numeric> #include <functional> #include <ctype.h> using namespace std; const int kMAX=2500; const double kEPS=10E-6; long long dp[101][kMAX]; //dp[x][y]表示的是在用了x枚硬币的情况下,到达y值的路径数 int main(void) { #ifdef DEBUG freopen("../stdin.txt","r",stdin); freopen("../stdout.txt","w",stdout); #endif int n,ncase=1; int value[]={0,1,5,10,25,50}; memset(dp,0,sizeof(dp)); dp[0][0]=1ll; for (int i=1;i<=5;++i) //用的硬币 { for (int j=1;j<=100;++j) //硬币数目 { for (int k=value[i];k<kMAX;++k) { dp[j][k]+=dp[j-1][k-value[i]]; } } } while(~scanf("%d",&n)) { long long ans=0ll; for(int j=0;j<=100;++j) ans+=dp[j][n]; printf("%lld\n",ans); } return 0; }