由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请教一道有趣的算法题,请大侠点拨一下思路
相关主题
f 的面经关于尾递归
一道count frequency of all words的面试题为什么这个阶乘函数算到37就溢出了?
Re: 一道count frequency of all words的面试题 (转载)晕了,有人用iteration解n queens么
生成一个有重复数的全排列,怎么做比较好reorder list 递归方法超时
算法题求教新年报 Yahoo Package
顺时针打印MxN矩阵的简洁递归解法what is the internal implementation of Deque
如何在面试中写出好的代码?(一)[算法]二分搜索变体
ooyala电面一道google 题,谁给翻译一下意思,多谢。
相关话题的讨论汇总
话题: int话题: sum话题: set话题: coin话题: index
进入JobHunting版参与讨论
1 (共1页)
a***o
发帖数: 24
1
Suppose you are given a function void NumberofSum(int n) , write a code such
that will print all the numbers that will sum up to n.
Input n Output
1 {1}
2 {(1,1),(2)}
3 {(1,1,1),(1,2),(3)}
4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!
l*********r
发帖数: 674
2
不用DP吧:
假设下标从1开始:
set[1] = 1;
set[i] = {i, set[i-1] X set[1], set[i-2] X set[2], ... ,set[i/2 -1] X set[i/2+1] }
X 是Cartesian product. 结果要remove duplicate。

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

a***o
发帖数: 24
3
我的思路也是类似,就是 set(4)={set(3)+1}U{set(2)+2}U{set(1)+3} (U是并集的意
思), 然后remove duplicate。 不过这样复杂很高的说。 不知道有没有啥高效的方法
Z*****Z
发帖数: 723
4
回溯

【在 a***o 的大作中提到】
: 我的思路也是类似,就是 set(4)={set(3)+1}U{set(2)+2}U{set(1)+3} (U是并集的意
: 思), 然后remove duplicate。 不过这样复杂很高的说。 不知道有没有啥高效的方法
: 。

a***o
发帖数: 24
5
大侠,可以详细讲一下吗?谢谢!

【在 Z*****Z 的大作中提到】
: 回溯
Z*****Z
发帖数: 723
6
你告诉我你会做马踏棋盘和穷举排列组合,我就给你讲这个:)

【在 a***o 的大作中提到】
: 大侠,可以详细讲一下吗?谢谢!
d******a
发帖数: 238
7
以前想过这道题,主要就是用递归吧。假设数组index放结果,首先就是选一个值为
index[0],剩下的index[1]到index[n]小于等于这个值,递归的时候index[0] >= index
[1] >= index[2] >= ... >= index[n].
void sum_helper(int *a, int index, int n, int max)
{
int i;

if(n == 0)
{
for(i = 0; i < index; i++)
printf("%d ", a[i]);

printf("\n");
return;
}

for(i = 1; i <= max && i <= n; i++)
{
a[index] = i;
sum_helper(a, index + 1, n - i, i);
}
}
void sum(int n)
{
int *a = (int *)malloc(sizeof(int) * n);
int max;

for(max = 1; max <= n; max++)
{
a[0] = max;
sum_helper(a, 1, n - max, max);
}
}

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

i**********e
发帖数: 1145
8
subset sum 的一个变种。
一些常见面试题的答案与总结 -
http://www.ihas1337code.com

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

x*********s
发帖数: 2604
9
void numberOfSum(int sum, vector v, int last)
{
if(sum == 0)
{
for (int i = 0; i < v.size(); i++)
{
cout< }
cout< return;
}
for (int i = 1; i <= sum; i++)
{
if(sum - i >= 0 && i >= last)
{
vector temp = v;
temp.push_back(i);
numberOfSum(sum-i,temp,i);
}
}
}
a***o
发帖数: 24
10
谢谢,有思路了~

【在 i**********e 的大作中提到】
: subset sum 的一个变种。
: 一些常见面试题的答案与总结 -
: http://www.ihas1337code.com
:
: such

相关主题
顺时针打印MxN矩阵的简洁递归解法关于尾递归
如何在面试中写出好的代码?(一)为什么这个阶乘函数算到37就溢出了?
ooyala电面晕了,有人用iteration解n queens么
进入JobHunting版参与讨论
A**l
发帖数: 2650
11
递归
F(n)
{
for(i=1; i output(i, F(n-i));
}
当然还需要考虑重复的输出

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

s*********l
发帖数: 103
12
http://spellscroll.com/questionfull/291/
http://en.wikipedia.org/wiki/Integer_partition
http://code.activestate.com/recipes/218332-generator-for-intege
http://www.cs.sunysb.edu/~algorith/files/generating-partitions.

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

P******x
发帖数: 259
13
递归啊

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

z*s
发帖数: 209
14
同意。

【在 i**********e 的大作中提到】
: subset sum 的一个变种。
: 一些常见面试题的答案与总结 -
: http://www.ihas1337code.com
:
: such

a***o
发帖数: 24
15
Thank you all. Really very helpful suggestions.
b*****e
发帖数: 474
16
思路是对的,就是用递归,多用个参数,就是最大的数/上限,
n_series_with_upperbound(n,k)
= UNION ( n_series_with_max(n,j) ), j=1,2,...k
n_series_with_max(n,j)
= (list j n_series_with_upbound(n-j,j)) if n>=j; EMPTY otherwise
n_series = n_series_with_upperbound(n,n).

such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

f*******4
发帖数: 1401
17
用DP可以解吗?用subset sum的方法一个一个解?
g*******s
发帖数: 490
18
DP就是从sum(n-1)推到sum(n),对于sum(n-1)的每个解,要不然在这个解中加一个
element 1,要不把这个解中现有的each element + 1,然后trim下,去掉duplicate就
可以了
k***s
发帖数: 277
19
受到wiki上的启发, http://en.wikipedia.org/wiki/Integer_partition
wiki上是用smallest addedn is k, 我改成with m's largest addend k
// k is the maximum number of integer partition;
// m is the num of k of integer partition.
void ip_helper(int n, int k, int m, std::deque sequence) {
if (n < k*m)
return;
if (k < 1)
return;
int i, j, r = n-k*m;
for (i=0; i sequence.push_back(k);
if (r == 0) {
for (i=0; i<(int)sequence.size(); ++i)
std::cout << sequence[i] << ' ';
std::cout << std::end;
return;
}
for (i=k-1; i>0; --i)
for (j=r/i; j>0; --j) {
ip_helper(r, i, j, sequence);
}
}
void ip(int n) {
std::cout << "integer partition for : " << n << std::endl;
int k,m;
std::deque sequence;
for (k=n; k>0; --k)
for (m=n/k; m>0; --m)
ip_helper(n, k, m, sequence);
}

【在 g*******s 的大作中提到】
: DP就是从sum(n-1)推到sum(n),对于sum(n-1)的每个解,要不然在这个解中加一个
: element 1,要不把这个解中现有的each element + 1,然后trim下,去掉duplicate就
: 可以了

c******n
发帖数: 4965
20
就是coin 问题, coin set 从1,2,3,.... 一直到n

code such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

c******n
发帖数: 4965
21
find_sum( total , remaining_coin_set, used_coin_set ) {
if ( total == 0 ) {
print_out(used_coin_set);
}
else {
use_this_coin = remaining_coin_set.pop();
more_used_coin_set = { used_coin_set }
for( sub_total = total; sub_total >= 0; sub_total -=
use_this_coin.value() ) {
find_sum( sub_total, remaining_coin_set, more_used_coin_set);
more_used_coin_set.add(use_this_coin);
}
}

code such

【在 a***o 的大作中提到】
: Suppose you are given a function void NumberofSum(int n) , write a code such
: that will print all the numbers that will sum up to n.
: Input n Output
: 1 {1}
: 2 {(1,1),(2)}
: 3 {(1,1,1),(1,2),(3)}
: 4 {(1,1,1,1),(1,1,2),(1,3),(2,2),(4)}
: 感觉上应该用DP,可是又没啥思路。请各位大侠不吝赐教!谢谢!

1 (共1页)
进入JobHunting版参与讨论
相关主题
一道google 题,谁给翻译一下意思,多谢。算法题求教
问道G题(4)顺时针打印MxN矩阵的简洁递归解法
贴个find kth prime number的CODE并请教。。。如何在面试中写出好的代码?(一)
G面经 求blessooyala电面
f 的面经关于尾递归
一道count frequency of all words的面试题为什么这个阶乘函数算到37就溢出了?
Re: 一道count frequency of all words的面试题 (转载)晕了,有人用iteration解n queens么
生成一个有重复数的全排列,怎么做比较好reorder list 递归方法超时
相关话题的讨论汇总
话题: int话题: sum话题: set话题: coin话题: index