TYVJ1096(contest hunter5201数字组合)(dp)

描述
在N个数中找出其和为M的若干个数。先读入正整数N 1 < N < 100 和M ( 1 < M < 10000 ) , 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数中找出若干个数, 使它们的和是M, 把满足条件的数字组合都找出来以统计组合的个数,输出组合的个数(不考虑组合是否相同)。

输入格式
第一行是两个数字,表示N和M。
第二行起是N个数。

输出格式
就一个数字,表示和为M的组合的个数。

样例输入
4 4
1 1 2 2
样例输出
3


01背包。

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define fr first
#define se second
#define ll long long
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
ll dp[10010];
int n , m , a[110];
int main()
{
    dp[0] = 1;
    n = read();m = read();
    rep(i,1,n) a[i] = read();
    rep(i,1,n)
        repp(j,m,a[i]) dp[j] += dp[j-a[i]];
    printf("%lld\n",dp[m]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1035719430/article/details/82456017