题目描述; 给定几种钱的面值,问用这些钱凑出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 }

相关文章:

  • 2021-09-26
  • 2021-11-28
  • 2021-07-14
  • 2021-06-14
  • 2021-12-28
  • 2021-05-21
  • 2022-12-23
猜你喜欢
  • 2021-06-18
  • 2022-12-23
  • 2022-12-23
  • 2022-02-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案