动态规划——5 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m

27 篇文章 0 订阅

这是一道中兴的面试题


题目:

输入两个整数 和 m,从数列123.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.


这道题就是一道典型的动态规划问题了,思路和背包问题差不多,m就相当于背包能容纳的重量了,就是从右往左校验,通过m,以及m-n进行下一次

也就是当前是printList(m,n)那接下来就是进行printList(m,n-1)和printList(m-n,n-1)进行递归

而终止条件是n<=0,以及m<0(m<0说明在上一次递归调用是减的n(相对于当前应该为n+1)是减多了,为负),m==0时候说明正好找到,打印


/**
 * 题目:(动态规划)<br/>
 * 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
 * prinList(sum,n)= printList(sum-n,n-1)+printList(sum,n-1);
 * 
 * @author chenxuegui
 * 
 */
public class Algorithm021
{
	public static void main(String[] args)
	{
		int n = 20;
		int m = 8;
		List<Integer> list = new ArrayList<>();

		int up = n > m ? m : n;

		printList(m, up, list);
	}

	/**
	 * 
	 * @param m
	 *            剩些的能减去的数
	 * @param n
	 *            遍历的树列中的最大,从1,2,3...n右往左校验
	 * @param list
	 */
	public static void printList(int m, int n, List<Integer> list)
	{
		if (m == 0)
		{
			System.out.println(list);
			return;
		}

		if (n <= 0 || m < 0)
		{
			return;
		}

		List list1 = new ArrayList<>(list);
		printList(m, n - 1, list);

		list1.add(n);
		printList(m - n, n - 1, list1);

	}
}

结果:




### 回答1: 以下是一个简单的 C 语言代码实现: ```c #include <stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] < arr[j + 1]) { swap(&arr[j], &arr[j + 1]); } } } } int main() { int n; printf("请输入整数n:"); scanf("%d", &n); int arr[n]; printf("请输入%d个整数:", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } bubble_sort(arr, n); printf("从大到小排序后的结果为:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 该程序使用了冒泡排序算法输入的 n 个整数进行排序,最终输出从大到小排序后的结果。 ### 回答2: 首先,我们可以通过一个组来存储输入的n个整数。然后使用冒泡排序算法对这个组进行从大到小排序。 冒泡排序的基本思想是通过多次比较和交换相邻元素的位置,将最大的元素逐渐“冒泡”到最后的位置。具体步骤如下: 1. 首先,我们定义一个大小为n的整型组,用于存储输入的n个整数。 2. 然后,我们通过循环从键盘依次输入n个整数,并将它们存储到。 3. 接下来,我们使用两层嵌套循环进行比较和交换操作。外层循环控制进行比较和交换的次,内层循环用于实际的比较和交换操作。 4. 在内层循环,我们通过比较相邻两个元素的大小,并在需要时进行交换。具体的比较和交换操作可以使用if语句实现。 5. 经过一轮比较和交换操作后,最大的元素会被“冒泡”到当前循环的最后位置。 6. 接着,我们将外层循环的次减一,并重复步骤4和步骤5,直到完成所有的比较和交换操作。 7. 最后,我们将排序后的组从大到小输出到屏幕上。 考虑到输入规模较小,冒泡排序算法是一种简单而直观的排序算法,并且可以满足题目的要求。 需要注意的是,题目要求输入的n为1到10之间的正整数,因此我们需要对输入进行合法性检查,确保输入的n满足要求。同时,对于输入整数也需要进行合法性检查,确保输入整数符合题目的要求。 ### 回答3: 首先我们需要明确题目的要求,根据题目要求,我们需要对输入的n个整数进行排序,并按照从大到小的顺序输出结果。 接下来,我们可以使用一种经典的排序算法——冒泡排序算法来实现这个功能。冒泡排序算法的基本思想是通过相邻元素的比较和交换,将最大的元素逐渐 “冒泡” 到数列的末尾。 具体实现过程如下: 1. 首先,我们根据输入的正整数n定义一个长度为n的整数组arr,来存储待排序的n个整数。 2. 然后,我们使用一个for循环来输入n个整数,并将它们保存在组arr。 3. 接下来,我们使用两层嵌套的for循环来进行冒泡排序。外层循环控制每一趟排序的次,内层循环用来比较相邻元素的大小并交换位置。 4. 在内层循环,我们通过比较arr[j]和arr[j+1]的大小来确定是否需要交换位置,如果arr[j]大于arr[j+1],则将它们的位置进行交换。 5. 最后,当每一趟冒泡排序完成后,我们可以得到一个当前最大的元素 “冒泡” 到数列的末尾,因此需要将内层循环比较交换的次稍作调整。 6. 循环结束后,我们得到的组arr就是已经按照从大到小排序的顺序,我们可以使用一个for循环遍历组arr,并依次输出每一个元素即可。 最后,我们得到了按照从大到小排序的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值