题目链接:http://acm.ocrosoft.com/problem.php?cid=1454&pid=10
题目描述:
给你一个n种面值的货币系统,求组成面值为m的货币有多少种方案。
输入
第一行为n和m。
输出
样例输入
3 10
1
2
5
样例输出
10
提示
【输入样例】
3 10 //3种面值组成面值为10的方案
1 //面值1
2 //面值2
5 //面值5
【输出样例】
10 //有10种方案
思路:动态规划就直接过了,水题,f记录方案数,w记录价值
动态转移方程:f[j] = f[j] + f[j - w[i]]
代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<string.h>
#define maxn 30000
long long v, n, t, f[maxn] = { 0 }, w[maxn];
using namespace std;
int main()
{
cin >> n >> v;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
f[0] = 1;//初始化f,f[i]表示i重量的方案数
for (int i = 1; i <= n; i++)
{
for (int j = w[i]; j <= v; j++)
{
f[j] = f[j] + f[j - w[i]];//每次都要更新,动态转移方程
}
}
cout << f[v] << endl;
return 0;
}