【算法】类背包问题解决组合数以及其java实现

本文解析了一道典型的动态规划题目,即求出1到n的整数中能组成整数m的所有组合个数。通过递归算法实现了问题的解决,并提供了Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是今年迅雷面试题,原题如下:

   给定整数n,取若干个1到n的整数可求和等于整数m,编程求出所有组合的个数。比如当n=6,m=8时,有四种组合:[2,6], [3,5],     [1,2,5], [1,3,4]。限定n和m小于120 
输入描述
整数n和m

输出描述: 
求和等于m的所有组合的个数。

输入例子1: 
6 8

输出例子1: 
4

 

首先这是一个动态规划问题,类似于背包问题, 不同的是其每个数的权重就是其本身,并且最后求得的结果是组合的个数,而不是组合的方法。分成以下几种情况:

1.当n<1或者m<1时,就没有组合数了。

2.当n=m时,此刻有一种稳定的组合方法就是n=m这一种。

3.当n>m 时, 数字大于m的组合都不存在,比如m=4,n=6.那么5,6,两个数组就不可能出现在组合里了,所以令n=m只要计算f(4,4)的个数就行了。

4.当n<=m时,就是往容量为m的包里填个数了,因为n=m在(2) 中稳定存在一种组合方式。所以只要计算n<m的递归式就行了。

V(n, m)=max{V(n-1, m-n)+Vi,V(n-1, m)} 

java实现代码如下:

public class bag01_question {
	public int bag(int n ,int m) {
		if(n==0||m==0)
			return 0;
		if(n>m)
			n=m;
		
		int sum = 0;
		if(m==n) 
			sum++;
		
		sum+= bag(n-1,m);
		sum+= bag (n-1,m-n);
		
		return sum;		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner ms = new Scanner(System.in);
		int n = ms.nextInt();
		int m = ms.nextInt();
		int mo = new bag01_question().bag(n,m);
		System.out.println(mo);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值