#DP# ----- 数字组合

OpenJudge 2985:数字组合

总时间限制:1000ms  内存限制: 65536kB
描述
有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背包。
 1 #include<stdio.h>
 2 int n,m;
 3 int d[25],f[25][1010];
 4
 5 int main(){
 6     scanf("%d%d",&n,&m);
 7     for(int i=1;i<=n;++i){
 8         scanf("%d",&d[i]);
 9         f[i][d[i]]=1;//前i个数组成d[i]方案数都=1(自己组成)
10     }
11     for(int i=2;i<=n;++i){
12         for(int j=1;j<=d[i];++j)f[i][j]+=f[i-1][j];//第i个数不取
13         for(int j=d[i]+1;j<=m;++j)
14             f[i][j]+=(f[i-1][j]+f[i-1][j-d[i]]);//1-(i-1)个数已组成j 2-i个数组成j,即(i-1)个数组成(j-d[i])
15     }
16     printf("%d",f[n][m]);
17     return 0;
18 }
19 //f[i][j]前i个数(不要求i个数全部取)能组成j的方案数

时间: 2024-08-09 12:58:21

#DP# ----- 数字组合的相关文章

OpenJudge 2985数字组合 解析报告/DP

2985:数字组合 总时间限制:  1000ms 内存限制:  65536kB 描述 有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

4829 [DP]数字三角形升级版

4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,且!!!!!!!!! ================================================================================== =================

tyvj1096 数字组合

描述 在N个数中找出其和为M的若干个数.先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数中找出若干个数, 使它们的和是M, 把满足条件的数字组合都找出来以统计组合的个数,输出组合的个数(不考虑组合是否相同).要求你的程序运行时间不超过1秒. 输入格式 第一行是两个数字,表示N和M.第二行起是N个数. 输出格式 就一个数字,表示和为M的组合的个数. 测试样例1 输入 4 4 1 1 2 2 输出

JS生成随机的由字母数字组合的字符串

前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇妙的写法 1 Math.random().toString(36).substr(2); 输出结果 解释 很有意思,研究了一下,基本上toString后的参数规定可以是2-36之间的任意整数,不写的话默认是10(也就是十进制),此时返回的值就是那个随机数. 若是偶数,返回的数值字符串都是短的,若是奇数,则返回的将是一个很大长度的表示值. 若<10 则都是数字组成,>10 才会包含字

JAVAWEB项目实现验证码中文、英文、数字组合

验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意破解密码.刷票.论坛灌水.有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录. 二.图文验证码的原理 :在servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码.为了增加验证码的安全级别,可

工具类:获得随机字母和数字的组合(字母+数字组合,字母组合,数字组合)

package util; import java.util.Random; /** * * @author jkfeng * 获得随机字母和数字的组合(字母+数字组合,字母组合,数字组合) * */ public class RandomCharOrNumUtil { public static void main(String[] args) { System.out.println(getCharAndNum(6)); System.out.println(getChar(6)); Sys

背包问题 codevs2210 数字组合

数字组合 题目描述 Description 在N个数中找出其和为M的若干个数.先读入正整数N和M, 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数中找出若干个数, 使它们的和是M, 把满足条件的数字组合都找出来以统计组合的个数,输出组合的个数(不考虑组合是否相同).要求你的程序运行时间不超过1秒. 输入描述 Input Description 第一行是两个数字,表示N和M.第二行起是N个数. 输出描述 Output Description 就一个数字,表示和为M的组合

2985:数字组合

2985:数字组合 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有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的不同的组合方式的数

[TVYJ1096]数字组合

时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 在N个数中找出其和为M的若干个数.先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数中找出若干个数, 使它们的和是M, 把满足条件的数字组合都找出来以统计组合的个数,输出组合的个数(不考虑组合是否相同).要求你的程序运行时间不超过1秒. 输入格式 第一行是两个数字,表示N和M.第二行起是N个数. 输出格式 就