题目描述
Mirko很喜欢解方程。这次他拿到1个多元一次方程A1B1+A2B2+……+AnBn=C。现在给出C的值,并且给出所有的A的值,即A1,A2,……,An的值,求出B1,B2,……Bn有多少组非负整数解。
输入
输入:第一行是两个整数n和c;
第二行有n个整数:分别表示A1到An
输出
输出:
输出总解数(用999983取模).
样例输入
2 4 1 2
样例输出
3
解题思路
解方程实际并不难,看出是什么题就可以解决。既然告诉我们A的值,我们姑且假设B1后面的全是0,那么就要用A1来装满C。然而后面的B并不一定全为0,那么就是用所有的A想方设法来填满B了,于是我们便可以看出来这道题的方法。就是一道完全背包求总数的问题。实现于是就十分轻松了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
int n,c,a[10005],dp[100005];
int main(){
scanf ("%d%d",&n,&c);
for (int i = 1; i <= n; i ++ ){
scanf ("%d",&a[i]);
}
dp[0]=1;
for (int i = 1;i <= n; i ++ ){
for (int j = a[i] ; j <= c ;j ++ ){
dp[j] += dp[j - a[i]];
dp[j] %= 999983;
}
}
printf("%d",dp[c]);
}