cheeryoung 发表于 2010-10-24 19:13

1239
1248
1257
1347
2346

1124629740 发表于 2010-10-24 22:18

{:3_41:}{:3_41:}{:3_41:}

guoshaoming 发表于 2010-10-25 00:04

本帖最后由 guoshaoming 于 2010-10-25 00:08 编辑

回复 maybe_madio 的帖子
分配方案如下:
6       4       3       2
6       5       3       1
7       4       3       1
7       5       2       1
8       4       2       1
9       3       2       1
其代码如下:
#include < iostream >

using namespace std;


int main()
{
int x1,x2,x3,x4;
int t=0;

for(x1=1;x1<15;x1++)
for(x2=1;x2<15;x2++)
for(x3=1;x3<15;x3++)
for(x4=1;x4<15;x4++)
{
if((x1+x2+x3+x4==15)&&(x1>x2)&&(x2>x3)&&(x3>x4))
cout<<x1<<"\t"<<x2<<"\t"<<x3<<"\t"<<x4<<endl;

}
return 0;
}

   

maybe_madio 发表于 2010-10-25 19:47

回复 guoshaoming 的帖子


    虽然对于15来说,比较容易算出, 那如果我的变量再增多呢? 假设有x1+x2+..xm=n呢?(m<n)
能否有更好的程序算法来解决这个问题呢? 你的穷举算法也只能适用于少量的变量和n较小的特例,当变量增多,或是n变大,这是阶乘级的时间复杂度哦!

guoshaoming 发表于 2010-10-25 22:52

回复 maybe_madio 的帖子
本身这个算法就很具有一般性,如果你增加变量,只要对程序稍加改动就可以了,
for(xm=1;xm<n;xm++)
然后判断语句和输出也做相应改变

   

guoshaoming 发表于 2010-10-25 23:17

回复 maybe_madio 的帖子
当你的变量大到一定程度的时候,你可以将约束条件写成一个循环语句,判断、输出也可以写成相应的循环语句!
反正程序的总体思路就是上面那个,过多的我就不多说了
   

linmatsas 发表于 2010-10-25 23:21

要是好多好多球好多好多盒子可怎么办呢…………这真是一个问题呀………………不过一时想不出来其他算法了……应该穷举能做呀…………应该用不了几个小时吧…………

whui 发表于 2012-1-1 15:54

13种呀。。。。。。。。。。。。。。。。

whui 发表于 2012-1-1 18:35

13种。。。。。。。。。。。。。

漂流者 发表于 2012-1-5 18:29

可以先把15个球排成一排,然后从他们之间的14个间隔里插入3块板,就可以把15个小球分成4份了,用这个思想,可以很容易解决你的问题,隔板法是很经典的东西。
页: 1 [2]
查看完整版本: 分配难题