POJ 1664 放苹果【DFS】

题意:给出n个苹果,m个盘子,问有多少种不同的苹果放置方法

可以把它抽象为把一个数n,拆分成a1,a2,a3,---,am,使得它们的和为n,

话说这一题是学习的ppt里面的,它的思路就是搜索

搜索条件的设置:放置苹果到第k个盘子的时候,要求第k个盘子里面的苹果数目大于第k-1个盘子里面的苹果数目,如果大于,则把它放置在第k个盘子里,如果不大于,则继续放置苹果,如果剩下的苹果小于k-1个盘子里面的苹果,就停止这个分支的搜索

学搜索学的还是蒙蒙的---

这一题如果自己模拟一下样例是怎么搜的,好理解一点

7 3

8

分别是这8种情况

0 0 7

0 1 6

0 2 5

0 3 4

1 1 5

1 2 4

1 3 3

2 2 3

------------------------

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[10010],cnt,n,m;

void dfs(int k,int w) //k代表现在已经用了的盘子数目,w表示已经放了几个苹果
{
	if(k==m)  //当放置到最后一个盘子的时候进行判断
	{
		if(n-w>=num[k-1]) //如果此时剩下的苹果数大于第k-1个盘子中的苹果的数目,那么将剩下的苹果放到最后一个盘子中
		{
			num[k]=n-w;
			cnt++;
		}
		return;
	}
		for(int i=0;i<=n;i++)
		{
			if(i>=num[k-1])
			{
				num[k]=i;
				w=w+i;
				k=k+1;
				dfs(k,w);//继续找下一个盘子放的苹果
				w=w-i;
				k=k-1;
			}
		}
}
int main()
{
	int ncase;
	scanf("%d",&ncase);
	while(ncase--)
	{
		scanf("%d %d",&n,&m);
		cnt=0;
		dfs(1,0);//最开始的时候是一个盘子,用了0个苹果
		printf("%d\n",cnt);
	}
}

  

时间: 2024-08-07 13:52:39

POJ 1664 放苹果【DFS】的相关文章

[ACM] POJ 1664 放苹果(n个相同小球放入m个相同盒子)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25952   Accepted: 16509 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

poj 1664 放苹果(dfs)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30284   Accepted: 19098 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

poj 1664 放苹果 递归

题目链接: http://poj.org/problem?id=1664 题目描述: 有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式? 解题思路: 当前有n个苹果,m个盒子. (1):假设当前最少的盒子放置一个苹果,则给m个盒子分别放一个苹果,剩下n-m个苹果. (2):假设当前最少的盒子不放苹果,则剩m-1个box,n个苹果. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <c

POJ 1664 放苹果 (递推)

题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] 递推而来. 当盘子的个数大于等于苹果的个数: dp[i - 1][j] :i - 1个盘子放j个苹果,说明i个盘子里最少有一个盘子是空的 dp[i][j - i] :i个盘子都放了苹果,说明有j - i个苹果是随便放置的 否则: dp[i][j] = dp[i - 1][j] 然后没有苹果的盘子的方

POJ 1664 放苹果

传送门:https://i.cnblogs.com/EditPosts.aspx?opt=1 解题思路: m:苹果数量,n:盘子数量. f(m,n):=m个苹果放在n个盘子的方案数 1.n>m 这时总会有有n-m个盘子剩下,这时问题就可以转换到  f(m,m) 2. n<=m 这时有两种情况,每个盘子都放,然后就是把m-n个苹果放入n个盘子  f(m-n,n); 至少有一个盘子不放,那么就是把m个苹果放入n-1个盘子f(m,n-1); 基本情况 只有1个苹果,或0个苹果只有一种情况. 只有一个

POJ 1664 把苹果

 把苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25785   Accepted: 16403 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5,1,1和1.5,1 是同一种分法. Input 第一行是測试数据的数目t(0 <= t <= 20).下面每行均包括二个整数M和N,以空格分开.1<=M,N<=10. Out

POJ 1644 放苹果 递推 递归

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28356   Accepted: 17939 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

[poj]1644放苹果

题目链接:http://poj.org/problem?id=1664 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 解题思路: 设f(m,n)为把m个苹果放到n个盘子中的方法数,m>=0,n>=0. 若m和n中任何一个等于0,那么f(m,n) = 1,注意不是等于0,因为相当于就那么一种结果,就是不往盘子里面放(没有苹果),或者,连盘子都没有.若n=1,显然对于任意的m>=0 有f(m,1) =

poj 1664 放平果

此问题可分为两个子问题:当m<n时,如3个苹果放入4个盘子中,和3个苹果放3个盘子的方法数是一样的. 所以m<n时,f[m][n]=f[m][m]; 当m>=n时,可分为两种放法,一种为至少有一个盘子为空,则有f[m][n-1]种放法. 另外为n个盘子都不为空,则先将n个苹果一个一个放入n的盘子中,剩下的m-n个苹果再放入n个盘子中.此放法就相当于m-n个苹果放n个盘子里面,有f[m-n][n]种放法. 所以状态转移方程为f[i][j]:if(i>=j)f[i][j]=f[i][j