洛谷 P2834 纸币问题 3-普及-
题目背景
你是一个非常有钱的小朋友。
注意: 本题和《进阶篇》的对应题目,输入格式略有差异。
题目描述
你有 nnn 种面额互不相同的纸币,第 iii 种纸币的面额为 aia_iai 并且有无限张,现在你需要支付 www 的金额,请问有多少种纸币组合能恰好支付金额 www,答案对 109+710^9+7109+7 取模。
输入格式
第一行两个正整数 n,wn,wn,w,分别表示纸币的种数和要凑出的金额。
第二行一行 nnn 个以空格隔开的正整数 a1,a2,…ana_1, a_2, \dots a_na1,a2,…an 依次表示这 nnn 种纸币的面额。
输出格式
一行一个整数,表示能恰好凑齐面额 www 的纸币组合数量。
输入输出样例 #1
输入 #1
6 15
1 5 10 20 50 100
输出 #1
6
输入输出样例 #2
输入 #2
3 15
1 5 11
输出 #2
5
说明/提示
对于 40%40\%40% 的数据,满足 n≤10n\le 10n≤10,w≤100w\le 100w≤100;
对于 100%100\%100% 的数据,满足 1≤n≤1031\le n\le 10^31≤n≤103,1≤ai,w≤1041\le a_i , w\le 10^41≤ai,w≤104。
其实小朋友并不有钱。
solution
代码
#include<iostream>
#include "unordered_map"
#include "unordered_set"
#include "stack"
#include "queue"
#include "cstring"
#include "algorithm"using namespace std;
const int N = 1e3 + 5, INF = 1e4, M = 1e4 + 5, mod = 1e9 + 7;int a[N], n, w, f[M], g[M];int main() {cin >> n >> w;for (int i = 0; i < n; i++) cin >> a[i];f[0] = 1;for (int i = 0; i < n; i++) {for (int j = a[i]; j <= w; j++) {f[j] = (f[j] + f[j - a[i]]) % mod;}}cout << f[w];return 0;
}