zoukankan      html  css  js  c++  java
  • 数字组合(动态规划)

    数字组合

    时间限制: 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
  • 相关阅读:
    常用的20个正则表达式
    关于position:fixed;的居中问题
    Html table 合并单元格
    JS异步加载的三种方式
    DOM事件代码小结
    用js写一个回车键盘事件
    JavaScript 常用方法总结
    可拖拽进度条
    js数组拍平
    js验证码倒计时
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5775081.html
Copyright © 2011-2022 走看看