[DP]解方程

题目描述

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]);
}

猜你喜欢

转载自blog.csdn.net/weixin_43904950/article/details/84762731