作者chhsiao (bye~)
看板b96902HW
标题[使徒] 来点提示好了 ;p
时间Thu Oct 25 23:30:03 2007
: 记得P老师上课说
: 一个指标指着每一个阵列里的元素
: 决定选或不选
: 要怎麽决定??
: <code 马赛克>
: 这个是遇到了整除的就选
: <code 马赛克>
: 这个是遇到了整除的就跳过
: 那到底要怎麽决定选or不选??
: 因为是要print出所有可能的情况...
: 想了好久 给点提示ㄅ...
Well, 你有来助教课吗? XD
以助教课上的例子来说,
假设我们写了一个 function: int choose(n, m),
要列出从 1, 2, ..., n 之中选 m 个数的所有方式,
事实上可以想成:
1. 不选第 n 个数, 直接列出 1, 2, ..., n - 1 之中选 m 个数的所有方式.
2. 选第 n 个数, 再列出 1, 2, ..., n - 1 之中选 m - 1 个数的所有方式.
上面两种情况就包含所有的可能了.
因此, choose(n, m) 可以这样写: (注意我省略了一些终止条件)
void choose(int n, int m){
if(m == 0){ /* 全部都选完之後再输出 */
output the choice;
return;
}
choose(n - 1, m); /* 不选 n */
select n; /* 也许是在一个阵列里做一个记号,
或是把 n 记录到某个用来输出的阵列 */
choose(n - 1, m - 1); /* n 已经选起来了 */
unselect n; /* 记得要把选 n 的动作清除! 要不然你可以试试看 XD */
}
第一个 choose(n - 1, m) 跑完後, 就会列出所有 "不选 n" 的方式,
第二个 choose(n - 1, m - 1) 跑完後, 就会列出所有 "选 n" 的方式.
我想, 上面的注解里应该有回答到你的问题吧?
: ps可以要助教的msn吗??
我有公布啊 ;p
不过我只偶尔上一下而已 XD
: 还有礼拜三的投影片 可以上传了吗XD
李振宇助教的投影片快要上传了 XD
我的要把後面没讲的修掉, 不过今天比较忙还没修 ^^"
明天会上传.
--
>_<
U
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.54
1F:推 folkterry:well! 好像不是那麽容易就可以击杀使徒五 10/25 23:33
2F:推 greenoyster:那个 我还没传这礼拜的^^" 10/25 23:43
3F:推 chhsiao:囧 我看错了 以为网页有更新 10/25 23:44
※ 编辑: chhsiao 来自: 140.112.30.54 (10/25 23:45)
4F:推 chhsiao:又忘记上传了 XD 现在己上传, 不过 oyster 助教的还没有. 10/27 01:15