一本通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;
}
posted @ 2020-05-15 17:45  徐明拯  阅读(701)  评论(0编辑  收藏  举报