[求助] 一道ACM题 分苹果 实在是想不出来,哪位牛人帮帮忙啊

呆呆的人v 2012-04-26 12:16:23
Description

有1000个苹果和10个筐子,筐子的编号为1-10.现要将这1000个苹果放入这10个筐子,要求:

(1)编号大的筐子中的苹果数量要严格大于编号小的筐子中的苹果数.

(2)从1-1000中任取1个数字,这个数字都能由10个筐子中的某几个筐子的苹果数和组成.

注意:筐中的苹果是一个整体,不能取筐中的一部分苹果,即一旦选取某个筐子,该筐的苹果数就必须全部计入.
Input
没有输入.
Output

要求在屏幕上按"字典"升序打印出所有可行放法.

每行打印1种方法,按编号升序打印出对应的筐中苹果个数,中间用空格隔开.

注意:行尾不要有任何空格出现.
Example Input

Example Output

1 2 4 8 16 31 63 125 250 500
1 2 4 8 16 31 63 125 251 499
1 2 4 8 16 31 63 126 249 500
.
.
.
1 2 4 8 16 32 64 128 256 489
...全文
658 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
缺媳妇的郝 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

i*(n-1)<apples-i-(n-2)*(n-1)/2//这个是为什么呢!!!

引用 2 楼 的回复:

C/C++ code

#include <stdio.h>

void find(int apples, int n, int min)
{
static int basket[10];
int i,max;
if (n==……
[/Quote]
昨天晚上想清楚了,顺便谢了。当前的箩筐里面的肯定比后面几个里面的都少,比前面几个箩筐的多。而且还不能超过总数。这下应该就全了。
muyi66 2012-04-27
  • 打赏
  • 举报
回复
apples-i是剩下的苹果数目
(n-2)*(n-1)/2则是使得剩下的筐子里苹果逐个增加的数目
apples-i-(n-2)*(n-1)/2表示剩下的苹果数目再扣除需要递增的数目之后还需要多少个
(apples-i-(n-2)*(n-1)/2)/(n-1)计算出下一个框子里的苹果数
i<(apples-i-(n-2)*(n-1)/2)/(n-1),则可满足当前筐中的苹果数少于后续筐中数目。但这里有除法舍入问题存在。
i*(n-1)<apples-i-(n-2)*(n-1)/2,避开舍入问题
呆呆的人v 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

i*(n-1)<apples-i-(n-2)*(n-1)/2//这个是为什么呢!!!

引用 2 楼 的回复:

C/C++ code

#include <stdio.h>

void find(int apples, int n, int min)
{
static int basket[10];
int i,max;
if (n==……
[/Quote]
我还是不太懂 ;i*(n-1)<apples-i-(n-2)*(n-1)/2&&i<=max 它是如何保证那两个条件的
muyi66 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

i*(n-1)<apples-i-(n-2)*(n-1)/2//这个是为什么呢!!!

引用 2 楼 的回复:

C/C++ code

#include <stdio.h>

void find(int apples, int n, int min)
{
static int basket[10];
int i,max;
if (n==1)
{
if (apple……
[/Quote]用于保证后面几个箩筐里的苹果数目可以大于当前箩筐里的苹果数目。
muyi66 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

为什么要把max也设置成static的呢?

没仔细看你的代码,你这个好像真不能设置成static的,呵呵,不过思路差不多,我写的是把max这货当参数传递了,可以省掉那个求MAX的循环.
C/C++ code
//max=1;
//for (i=0;i<10-n;++i)
//max+=basket[……
[/Quote]嗯,这样更高效。
缺媳妇的郝 2012-04-26
  • 打赏
  • 举报
回复
i*(n-1)<apples-i-(n-2)*(n-1)/2//这个是为什么呢!!!

[Quote=引用 2 楼 的回复:]

C/C++ code

#include <stdio.h>

void find(int apples, int n, int min)
{
static int basket[10];
int i,max;
if (n==1)
{
if (apples>500)
return;
basket[9]=ap……
[/Quote]
玩笑 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

为什么要把max也设置成static的呢?
[/Quote]
没仔细看你的代码,你这个好像真不能设置成static的,呵呵,不过思路差不多,我写的是把max这货当参数传递了,可以省掉那个求MAX的循环.
        //max=1;
//for (i=0;i<10-n;++i)
//max+=basket[i];
for (i=min;i*(n-1)<apples-i-(n-2)*(n-1)/2&&i<=max;++i)
{
basket[10-n]=i;
find(apples-i,n-1,i+1,max+i);
}
  • 打赏
  • 举报
回复
(2)从1-1000中任取1个数字,这个数字都能由10个筐子中的某几个筐子的苹果数和组成.

怎么实现呢?睡觉前想想,呵呵
muyi66 2012-04-26
  • 打赏
  • 举报
回复
为什么要把max也设置成static的呢?
玩笑 2012-04-26
  • 打赏
  • 举报
回复
楼上的为什么不把max也设置成static的呢
muyi66 2012-04-26
  • 打赏
  • 举报
回复

#include <stdio.h>

void find(int apples, int n, int min)
{
static int basket[10];
int i,max;
if (n==1)
{
if (apples>500)
return;
basket[9]=apples;
for (i=0;i<9;++i)
printf("%d ",basket[i]);
printf("%d",basket[9]);
printf("\n");
}
else
{
max=1;
for (i=0;i<10-n;++i)
max+=basket[i];
for (i=min;i*(n-1)<apples-i-(n-2)*(n-1)/2&&i<=max;++i)
{
basket[10-n]=i;
find(apples-i,n-1,i+1);
}
}
}

main()
{
find(1000,10,1);
}
缺媳妇的郝 2012-04-26
  • 打赏
  • 举报
回复
2的0到9次可以表示1-1023之中所有的数,1-(n-1)之内的数能用1、2、4、…、n/2表示。但因为整数的原因,n为奇数的时候,n/2可以有两种选择。先提供下思路,感觉可行。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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