Uva 674 Coin Change
题目描述; 给定几种钱的面值,问用这些钱凑出n的价值有多少中方案。
分析:背包问题,统计填满背包的方案数。
dp [ i ] [ j ]表示用前j种面值凑出i钱的方案数。
dp [ i ] [ j ]=sum { dp [ i - k*s [ j ] ] [ j-1 ] }
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #define N 7500 5 using namespace std; 6 typedef long long ll; 7 ll dp[N][5]; 8 int w[5]={1,5,10,25,50}; 9 ll DP(int i,int j){ 10 if(dp[i][j]!=-1)return dp[i][j]; 11 dp[i][j]=0; 12 for(int k=0;i-k*w[j]>=0;k++) 13 dp[i][j]+=DP(i-k*w[j],j-1); 14 return dp[i][j]; 15 } 16 int main(){ 17 int n; 18 memset(dp,-1,sizeof(dp)); 19 for(int i=0;i<N;i++)dp[i][0]=1; 20 while(cin>>n){ 21 cout<<DP(n,4)<<endl; 22 } 23 return 0; 24 }