hackerrank The Coin Change Problem(dp)

来源:互联网 发布:mac英英词典 编辑:程序博客网 时间:2024/06/05 14:25

题目:https://www.hackerrank.com/challenges/coin-change/problem
题意:给你m种硬币,每种数量不限,问你硬币的和为n的方案数
思路:开始想的用dp[i][j]表示i种硬币组成和为j的方案数,那么dp[i][j] = dp[i-1][j] + dp[i][j-a[i]];
ac之后发现可以缩成一维(开始就该想到的,不熟练啊,,)

1.

#include <bits/stdc++.h>using namespace std;const int N = 255;int a[55];long long dp[55][N];int main(){    int m,n;    scanf("%d%d",&n,&m);    for(int i = 1;i <= m;i++)        scanf("%d",&a[i]);    for(int i = 1;i <= m;i++)        dp[i][0] = 1;    for(int i = 1;i <= m;i++)        for(int j = 1;j <= n;j++)            if(a[i] > j)                dp[i][j] = dp[i-1][j];            else                dp[i][j] = dp[i-1][j] + dp[i][j-a[i]];    printf("%lld\n",dp[m][n]);}//dp[i][j]表示i种硬币组成和为j的方案数

2.

#include <bits/stdc++.h>using namespace std;const int N = 255;int a[55];long long dp[N];int main(){    int m,n;    scanf("%d%d",&n,&m);    for(int i = 1;i <= m;i++)        scanf("%d",&a[i]);    dp[0] = 1;    for(int i = 1;i <= m;i++)        for(int j = a[i];j <= n;j++)            dp[j] += dp[j-a[i]];    printf("%lld\n",dp[n]);}//dp[i][j]表示i种硬币组成和为j的方案数
原创粉丝点击