HDU-2566,统计硬币(暴力 or DP)

简介: HDU-2566,统计硬币(暴力 or DP)

Problem Description:


假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。  


Input:


输入数据第一行有一个正整数T,表示有T组测试数据;

接下来的T行,每行有两个数n,m,n和m的含义同上。  


Output:


对于每组测试数据,请输出可能的组合方式数;

每组输出占一行。


Sample Input:


2

3 5

4 8


Sample Output:


1

2


AC Code(方法1:暴力):


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
  int t,ans,n,m;
  scanf("%d",&t);
  while(t--)
  {
    ans=0;
    scanf("%d %d",&n,&m);
    for(int i=0;i<=m/1;i++)
      for(int j=0;j<=m/2;j++)
        for(int k=0;k<=m/5;k++)
          if((i+j+k)==n&&(i*1+j*2+k*5)==m)
            ans++;
    printf("%d\n",ans);
  }
  return 0;
}

AC Code(方法2:DP):


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1001;
int dp[N][N];
int num[4]={0,1,2,5};//分别代表几种面值的硬币 
int main()
{
  int t,n,m;
  cin>>t;
  while(t--)
  {
    cin>>n>>m;
    memset(dp,0,sizeof(dp));//清零 
    dp[0][0]=1;//第一个值为1,表示用0个硬币构成面值为0的方案仅有一个 
    for(int i=1;i<=3;i++)//三种硬币(1,2,5) 
    {
      for(int j=1;j<=n;j++)//n个硬币 
      {
        for(int k=num[i];k<=m;k++)//每种硬币的面值 
        {
          dp[j][k]+=dp[j-1][k-num[i]];//硬币数量减1,同时减去对应硬币的面值 
        }
      }
    }
    cout<<dp[n][m]<<endl;
  }
  return 0;
}




相关文章
|
8月前
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
61 0
|
7月前
【题解】NowCoder DP4 最小花费爬楼梯
【题解】NowCoder DP4 最小花费爬楼梯
40 5
|
Java
hdu 2566 统计硬币
hdu 2566 统计硬币
57 0
|
机器学习/深度学习 定位技术
【每日一题Day109】LC1210穿过迷宫的最少移动次数 | BFS+dp
思路:使用BFS搜索,队列中存放三元组[蛇尾的横轴坐标x,蛇尾的纵轴坐标y,蛇的状态],当蛇为水平时,状态为0;当蛇为竖直时,状态为1
139 1
【每日一题Day109】LC1210穿过迷宫的最少移动次数 | BFS+dp
|
机器学习/深度学习 人工智能
51nod 1055 最长等差数列 (dp好题)
51nod 1055 最长等差数列 (dp好题)
60 0
|
人工智能
(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列
(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列
109 0
(闫氏dp分析法)AcWing 2. 01背包问题
(闫氏dp分析法)AcWing 2. 01背包问题
71 0
【刷穿 LeetCode】516. 最长回文子序列 : 区间 DP 求解最长回文子序列问题
【刷穿 LeetCode】516. 最长回文子序列 : 区间 DP 求解最长回文子序列问题
POJ 2689 Prime Distance (埃氏筛 区间筛)
POJ 2689 Prime Distance (埃氏筛 区间筛)
119 0