一本通1273货币系统(方案数背包)
【题目描述】
给你一个n种面值的货币系统,求组成面值为m的货币有多少种方案。
【输入】
第一行为n和m。
【输出】
一行,方案数。
【输入样例】
3 10 //3种面值组成面值为10的方案 1 //面值1 2 //面值2 5 //面值5
【输出样例】
10 //有10种方案
思路:这个方案数是累加起来的,怎么累加的呢?比如说,你用5种方案可以拿到五块钱,那你拿到十块钱的方案数,其实就是加上五块钱的方案数。同理,从三块钱拿到十块钱就加上三块钱的方案数等等等等,只要有一种货币可以一次拿到目标,那就加上拿之前的方案数就行了。
代码模板(本题代码):
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; int v[10010],f[10010]; int main() { int n,m; cin>>n>>m; f[0]=1;//注意要初始化,不然不会累加,加完还是0。 for(int i=1;i<=n;i++) cin>>v[i]; for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--) f[j]+=f[j-v[i]]; cout<<f[m]; return 0; }