数字组合(动态规划)

数字组合

时间限制: 1 Sec  内存限制: 256 MB
提交: 30  解决: 24
[提交][状态][讨论版]

题目描述

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

输入

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

输出

一个数字,表示和为M的组合的个数。

样例输入

4 4
1 1 2 2

样例输出

3
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include<functional>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int N=105;
const int M=10005;
ll power(ll a,int b,ll c) {ll ans=1;while(b) {if(b%2==1) {ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;}
int a[N],n,m,dp[M];
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    dp[0]=1;
    for(int i=1; i<=n; i++)
        for(int j=m; j>=a[i]; j--)
            dp[j]+=dp[j-a[i]];
    printf("%d",dp[m]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/jianrenfang/p/5775081.html