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 }
posted @ 2012-10-20 21:44  silver__bullet  阅读(175)  评论(0编辑  收藏  举报