Uva 674

Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
Submit  Status  Practice  UVA 674

Description


题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数。

背包:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<cctype>
#define max(a,b)(a>b?a:b)
#define min(a,b)(a<b?a:b)
#define INF 0x3f3f3f3f

using namespace std;

#define N 8000

int n,coin[5]={1,5,10,25,50};
long long dp[N]={1};

void init()
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<N-50;j++)
            dp[j+coin[i]] += dp[j];
    }
}

int main()
{
    init();
    while(scanf("%d",&n)!=EOF)
        printf("%lld\n",dp[n]);
    return 0;
}


递推:

  1. //dp[i][j]表示用前j种硬币组成i分的种类数  
  2. #include<stdio.h>  
  3. #include<string.h>  
  4. #define N 7500  
  5. int dp[N][6];  
  6. int v[5]={1,5,10,25,50};  
  7. int DP(int i,int j)  
  8. {  
  9.     if(j==0)  
  10.     return dp[i][j]=1;  
  11.     if(dp[i][j]!=-1)  
  12.     return dp[i][j];  
  13.     dp[i][j]=0;  
  14.     for(int k=0;i-k*v[j]>=0;k++)  
  15.     {  
  16.         dp[i][j]+=DP(i-k*v[j],j-1);  
  17.     }  
  18.     return dp[i][j];  
  19. }  
  20. int main()  
  21. {  
  22.     int n;  
  23.     memset(dp,-1,sizeof(dp));//memset只需初始一次即可,如果后边n很大,可以用之前存好的dp[][]  
  24.     while(scanf("%d",&n)!=EOF)  
  25.     {  //memset(dp,-1,sizeof(dp));//如果每次都初始化,那么每次都会从头算,会超时  
  26.         for(int i=0;i<=n;i++)  
  27.         dp[i][0]=1;  
  28.         printf("%d\n",DP(n,4));  
  29.     }  
  30.     return 0;  
  31. }  

你可能感兴趣的:(Uva 674)