(高分求)列出n个不同的球放m个不同的盒子的所有可能的代码

linxiyizhi 2011-04-09 12:57:39
加精
题目
N个 不同 的苹果(a,b,c,d……)
K个 不同 的篮子(A,B,C,D……)
1<=K<=N
篮子里至少有1个苹果,要列出所有情况

情况1:苹果必须放完
情况2:苹果可以不放完

代码语言不限,最好是C或Java

此题光情况1就纠结了整整一个晚上,未果,情况2更是早就放弃了,所以送上全部家当,望各位高人指点,谢啦!!!
...全文
2022 77 打赏 收藏 转发到动态 举报
写回复
用AI写文章
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyl550182402 2011-04-17
  • 打赏
  • 举报
回复
第一种情况:
就是N的K次方
第二种情况比较麻烦,因为苹果可以不放完,所以不知道是放了几个苹果,还要考虑到苹果的个数,可以是一个,两个……到K个
一个苹果的话有K种放法,
两个苹果的话有K*K种放法,
……
N个苹果的话就是N的K次方,
所以第二种情况也就是一个等比数列求和
linxiyizhi 2011-04-17
  • 打赏
  • 举报
回复
分数都发给大家了,主要分数都给了litaoye,我也只验证了litaoye的代码,第二次的代码应该是对的,我还在研究中。其他几位高人贴的代码就没一一验证了,以后有时间再看看了,不过还是谢谢大家了。我分数只有这么多了,麻烦各位了

PS:实在不好意思,这么久才来结贴,实在是有点小忙,呵呵。再次谢谢各位了。
woshichiren 2011-04-15
  • 打赏
  • 举报
回复
hfd df
sichuanwww 2011-04-14
  • 打赏
  • 举报
回复
可以考虑母函数。
kyu2010 2011-04-14
  • 打赏
  • 举报
回复
第二题应该是S(n,k)*(K!)+S(n,k+1)*(K!)
syp413165531 2011-04-14
  • 打赏
  • 举报
回复
第一:第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。
//n->有区别,K->非空,没区别
递推公式为,
S(n,n) = S(n,1) = 1,
S(n,k) = S(n-1,k-1) + kS(n-1,k).
因为第一题的K个篮子是有区别的,所以要乘以K的全排列
所以第一题答案应该是S(n,k)*(K!)

第二:{C(n,k)*S(k,k)+C(n,k+1)*S(k+1,k)+C(n,k+2)*S(k+2,k)+...+C(n,n)*S(n,k)}*(K!)
xunfeng_2008 2011-04-13
  • 打赏
  • 举报
回复
To:LZ,列出所有情况的算法并不难,递归即可,但能够求解的范围非常有限,比如n=20,k=10,算上输出的话,也许1年未必能够处理完,这样不就失去了意义么?
关键在思想
学习了…………
njz168 2011-04-13
  • 打赏
  • 举报
回复
装篮的调用错了。全排的是苹果,所以装篮的代码要作稍许修改。
njz168 2011-04-13
  • 打赏
  • 举报
回复
全排的代码。

quanpai(*arr,int n,int count) /* *arr 为需要全排的,n为个数,count 为全部个数*/
{
if (n==1)
{ Foo(arr -(count -1),count,count); /*装篮*/
}
else
{
int li,tmp;
for(li =0;li<n;li++)
{
//取第一位
tmp = *arr;
*arr=*(arr+li);
*(arr+li)= tmp;
quanpai(arr+1,n-1,count);
//恢复现场
tmp = *arr;
*arr=*(arr+li);
*(arr+li)= tmp;
}
}
}
tuzhi2335 2011-04-13
  • 打赏
  • 举报
回复
情况一:
if(N==K)
对a,b,c...进行K次全排列;
else
{
从N个苹果中选出K个(设剩余R=N-K),进行一次排列;
for(int i=1;i<=N-K;i++)
{
把剩下的R个苹果分成i个组(从R中选出任意i个苹果进行组合);
把i个组的苹果,放到K个篮子里(从K里选出i个位置进行排列);
}
}

情况二:可以参考2# showcraft
qq681812 2011-04-13
  • 打赏
  • 举报
回复
关键是思想。。。。
njz168 2011-04-13
  • 打赏
  • 举报
回复
不同的苹果?那可以先对所有苹果进行全排,然后再用我上面的代码。
wesweeky 2011-04-12
  • 打赏
  • 举报
回复
排列组合 总个数能算排出来就耗时了
njz168 2011-04-12
  • 打赏
  • 举报
回复
苹果不放完?相当于增加一个篮子。
njz168 2011-04-12
  • 打赏
  • 举报
回复
应该是1 - (N-K+1)
njz168 2011-04-12
  • 打赏
  • 举报
回复
用递归来做:
1.放完的,首先放第0个篮子,可以放的个数为1-(N-K)个,剩下的是剩下的放到K-1个篮子里。

Foo(int *Lanzi,int N,int K,int count) /*Lanzi是篮子,N个苹果,K个篮子,count是篮子的总数*/
{ int i;
static int cnt;
if (K==1)
{ *Lanzi=N;cnt+; /*此处可以打印出各篮子的个数,需要用到Lanzi -(count-1)*/}
else
{
for (i=1;i<=N-K;i++)
{
*Lanzi=i;
Foo(Lanzi+1,K-1,N-i,count);
}
}
}

jinwanmeng 2011-04-12
  • 打赏
  • 举报
回复
答案是……
陈大侠啊 2011-04-12
  • 打赏
  • 举报
回复
没研究过算法啊,然我用数学还成
绿色夹克衫 2011-04-12
  • 打赏
  • 举报
回复
其实逻辑很简单,就是n个苹果,m个篮子,每个苹果有m种放置方法,总共是n^m,不过这样会出现空篮子,因此我加了一个简单的计数,记录空篮子的数量,如果剩下的苹果数量小于空篮子数量,则停止递归,当然还可以优化,等别人做吧。

[Quote=引用 26 楼 linxiyizhi 的回复:]
litaoye的代码我还没看的太懂
[/Quote]
绿色夹克衫 2011-04-12
  • 打赏
  • 举报
回复
不好意思,代码果然弄错了,最简单的2个苹果2个篮子都有问题,修改了一下,LZ再帮忙测试一下。

using System;

namespace CsdnTest
{
class Program
{
static int[] Result;
static int[] Counter;
static Char[] Apples;
static int BasketCount = 3;

static void Main(string[] args)
{
Apples = new char[] { 'A', 'B', 'C'};
Result = new int[Apples.Length];
Counter = new int[BasketCount];
Solve(Apples.Length - 1, BasketCount);
Console.ReadKey();
}

static void Solve(int currentIndex, int emptyCount)
{
if (currentIndex < emptyCount - 1)
return;

if (currentIndex == -1)
{
for (int i = 0; i < Result.Length; i++)
Console.Write("{0}-{1} ", Apples[i], Result[i]);

Console.WriteLine();
return;
}

for (int i = 0; i < BasketCount; i++)
{
Counter[i]++;
Result[currentIndex] = i;

if (Counter[i] == 1)
Solve(currentIndex - 1, emptyCount - 1);
else
Solve(currentIndex - 1, emptyCount);

Counter[i]--;
}
}
}
}


[Quote=引用 26 楼 linxiyizhi 的回复:]

不好意思,这两天有点忙,没怎么来了。

litaoye的代码看到了,很谢谢litaoye能贴出了具体代码,看了litaoye的代码和运行结果才发现,自己之前贴出的代码真是漏洞百出,真是献丑了。litaoye的代码我还没看的太懂,主要是算法逻辑上的,回去再仔细研究下。

代码是运行的,但是好像有点小问题,我试了一个简单的情况,就是篮子个数是2,苹果分别是【 'A', 'B', 'C', '……
[/Quote]
加载更多回复(36)

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧