• 数字组合


    描述
    有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如:
    n=5,5个数分别为1,2,3,4,5,t=5;
    那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。
    输入
    输入的第一行是两个正整数n和t,用空格隔开,其中1<=n<=20,表示正整数的个数,t为要求的和(1<=t<=1000)
    接下来的一行是n个正整数,用空格隔开。
    输出
    和为t的不同的组合方式的数目。
    样例输入
    5 5
    1 2 3 4 5
    样例输出
    3

    查看

    做过复杂的整数划分问题,这个问题不难,重点是离散化

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #include<cstring>
    #define DEBUG(x) cout << #x << " = " << x << endl
    using namespace std;
    int N;
    int num[25];
    int dp[25][1010];///前i个数和为j的种数
    int Ways(int i,int j)
    {
        if(j==0)return 1;
        if(i==0)return 0;
        if(dp[i][j]!=-1)return dp[i][j];
        int r=Ways(i-1,j);
        if(num[i]<=j)r+=Ways(i-1,j-num[i]);
        dp[i][j]=r;
        return r;
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int t;
        scanf("%d %d",&N,&t);
        memset(dp,0xff,sizeof(dp));
        for(int i=1;i<=N;i++){
            scanf("%d",&num[i]);
        }
        printf("%d
    ",Ways(N,t));
        return 0;
    }
  • 相关阅读:
    内存溢出和内存泄漏的区别
    java 23种设计模式 深入理解
    关于安装office注册表权限的解决方法
    Tomcat在Linux上的安装与配置
    初窥Linux 之 我最常用的20条命令
    redis使用初体验
    学习进度条——第12周
    找水王
    学习进度条——第11周
    学习进度条——第10周
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9174007.html
Copyright © 2020-2023  润新知