继续学习DP算法,感觉一直不开窍啊。。。。
这道题目很经典了,给出m个价值不同的硬币c1、c2……cm,要求找出能够凑出总价为n的方法,在维基上看到大概的思路如下:
简单地理解,就是能够凑出价值i的情况只有两种,一种是不包括硬币cj,一种是包括硬币cj,我们只需要将两种情况相加即可
直接代码:
#include <bits/stdc++.h>
using namespace std;
int coin[51];
long long dp[251][51];//dp[i][j]表示价值i由C1~Cj组成方法有多少种
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1 ; i <= m ; i++)
{
cin >> coin[i];
}
memset(dp, 0, sizeof(dp));
for (int i = 1 ; i <= m ; i++)
{
dp[0][i] = 1; //总价值为0时,均有1种方案
}
for (int i = 1 ; i <= n ; i++)
{
if (i % coin[1] == 0) dp[i][1] = 1; //当价值i能够被C1整除时,有一种方案
}
for (int i = 1; i <= n ; i++)
{
for (int j = 1; j <= m ; j++)
{
if (coin[j] > i) dp[i][j] = dp[i][j - 1];
else dp[i][j] = dp[i - coin[j]][j] + dp[i][j - 1];
}
}
cout << dp[n][m] << endl;
return 0;
}