题目的意思就是有1,5.10.25.50面值的硬币..
组成目标值的方法有多少种..
首先我们可以想到,用这些硬币组成11有多少种.
就是组成10的种数,加上组成6的种数,加上组成1的种数,因为这些面值都是加上一枚硬币就得到11了.
然后我们又能继续去求1组成10的种数,那么明显就是9,5,0的组成数的和.
依次递归.并且每次都用d 数组记录下来,防止重复计算.
而d数组是二维的,第二维是用来防止多算,比如拿了1再拿5,和拿了5再拿1只能算一种.,所以我们算的时候,必须从小到大取,你不能去 1 ,5 , 1 ,只能取 1 ,1 ,5 .接下去算的那一个只能大于等于前一个 ,所以d[ 11 ][ 0 ],后面那个小标代表用到哪一个了..如果是d[ 9][ 1] ,就代表,还差9分钱,而你能取得硬币只有5.10.25.50这四种面值了..
很水的背包dp计数。。。以前背包都是求最大值,用max,现在求方案数就直接 += 就好了。。为什么+= 上面红字说的比较好
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1e5;
int dp[maxn], n, v[5] = {1, 5, 10, 25, 50};
int main()
{
while(~scanf("%d", &n))
{
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for(int i = 0; i < 5; i++)
for(int j = v[i]; j <= n; j++)
{
dp[j] += dp[j-v[i]];
}
printf("%d\n", dp[n]);
}
return 0;
}