列表

详情


NC51164. 数字组合

描述

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

输入描述

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

输出描述

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

示例1

输入:

4 4
1 1 2 2

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 2ms, 内存消耗: 364K, 提交时间: 2023-05-05 21:23:56

#include<stdio.h>
int v,f[1010];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    f[0]=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&v);
        for(int j=m;j>=v;j--){
            f[j]+=f[j-v];
        }
    }
    printf("%d",f[m]);
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 504K, 提交时间: 2020-03-22 17:31:26

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[102],f[10002]={1};
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	for(int i=1;i<=n;i++)
	for(int j=m;j>=a[i];j--)
	  f[j]+=f[j-a[i]];
	cout<<f[m];
	return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 584K, 提交时间: 2022-02-14 16:59:48

#include <iostream>
using namespace std;

int n,a,m,f[10005];

int main() {
	cin>>n>>m;
	f[0]=1;
	for (int i=1;i<=n;i++) {
		cin>>a;
		for (int j=m;j>=0;j--)
			f[j+a]+=f[j];
	}
	cout<<f[m];
}

上一题