由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 算法题求教
相关主题
请教leetcode Subsets II这个题咋做?
被这几个题目搞混了Subset of size m Problem
请叫大家一道题问一到题目
共享一道电面题k-sum问一个cracking code interview上的问题啊
boggle game是不是只有backtracking的解法?问个算法题2
请教一个题目FB online puzzle请教
写了一个Queens的backtrack 大牛帮我看看一道矩阵路径题
问一道算法题自己总结了下什么时候用dp(循环),什么时候用递归
相关话题的讨论汇总
话题: int话题: sum话题: depth话题: target话题: selected
进入JobHunting版参与讨论
1 (共1页)
x********3
发帖数: 160
1
有一个排序之后的数组有n个元素,取其中k个元素使得他们的和为sum。问这样的组合
一共有多少种?
例如数组A=[1,2,4,5,7,8],取2个数和为9的一共有3种[1,8],[2,7]和[4,5]。
我的解法是递归。应该有更好的解法吧,因为我没有用到已排序这个特性,而且递归效
率蛮差的。多谢!
q****x
发帖数: 7404
2
2的话很简单。一个头指针,一个尾指针,求和。小,头移动,大,尾移动。相等,同
时移动,直到相遇。
3的话,考虑sum-x[i],化归为2。

【在 x********3 的大作中提到】
: 有一个排序之后的数组有n个元素,取其中k个元素使得他们的和为sum。问这样的组合
: 一共有多少种?
: 例如数组A=[1,2,4,5,7,8],取2个数和为9的一共有3种[1,8],[2,7]和[4,5]。
: 我的解法是递归。应该有更好的解法吧,因为我没有用到已排序这个特性,而且递归效
: 率蛮差的。多谢!

x********3
发帖数: 160
3
2我只是举个例子,其实是任意的,当然应该远小于数组长度。谢谢!

【在 q****x 的大作中提到】
: 2的话很简单。一个头指针,一个尾指针,求和。小,头移动,大,尾移动。相等,同
: 时移动,直到相遇。
: 3的话,考虑sum-x[i],化归为2。

q****x
发帖数: 7404
4
任意是NPC吧。什么叫远小于?k = n/100算不算远小于?可k还是O(n)。

【在 x********3 的大作中提到】
: 2我只是举个例子,其实是任意的,当然应该远小于数组长度。谢谢!
g***s
发帖数: 3811
5
DP can solve it number are positive interger and sum is not very large.

【在 x********3 的大作中提到】
: 有一个排序之后的数组有n个元素,取其中k个元素使得他们的和为sum。问这样的组合
: 一共有多少种?
: 例如数组A=[1,2,4,5,7,8],取2个数和为9的一共有3种[1,8],[2,7]和[4,5]。
: 我的解法是递归。应该有更好的解法吧,因为我没有用到已排序这个特性,而且递归效
: 率蛮差的。多谢!

A**u
发帖数: 2458
6
这个题目我刚好练过
这里有介绍
http://www.geeksforgeeks.org/archives/14469
用backtracking.
关键是,这个树的有些node, 可以不用访问
比如 你要找9.
假设从1开始那么,到达(1,2,4)node.
(1,2,4)的和 加上 {5,7,8}的最小值 > 9.
所以不用考虑 包含1,2,4的node了,这样可以可以排序不少点
这是我的算法
#include
#include
#include
using namespace std;
void re(int depth, int sum, vector selected,int w[], int N, int target){
if ( depth == N )
{
if ( sum == target )
{
for(vector::iterator it = selected.begin(); it != selected.
end(); ++it)
cout << *it << " ";
cout << endl;
}
return;
}
re(depth + 1, sum, selected, w, N, target);
selected.push_back(w[depth]);
re(depth + 1, sum + w[depth], selected, w, N, target);
}
void subset_re(int w[], int N, int target ){
vector result;
re(0, 0, result, w, N, target);
}
bool promising(int depth, int sum_so_far, int sum_left, int w[], int N,int
target){
if ( depth < N)
return (sum_so_far + sum_left >= target) && ( sum_so_far == target
|| sum_so_far + w[depth] <= target );
else
return true;
}
void bk(int depth, int sum_so_far, int sum_left, vector selected, int w
[], int N, int target ){
if ( promising(depth,sum_so_far,sum_left,w, N, target) ){
if (sum_so_far == target )
{
for(vector::iterator it = selected.begin(); it != selected.
end(); ++it)
cout << *it << " ";
cout << endl;
}
else{
if (depth < N){
selected.push_back(w[depth]);
bk(depth + 1, sum_so_far + w[depth], sum_left - w[depth],
selected, w, N, target);
selected.pop_back();
bk(depth + 1, sum_so_far, sum_left - w[depth], selected,w, N
, target);
}
}
}
return;
}
void subset_bk(int w[], int N, int target){
vector result;
int all = 0;
for(int i = 0; i < N; ++i)
all += w[i];
bk(0,0,all,result, w, N, target);
}
int main(){
int weights[8] = {15, 22, 14, 26, 32, 9, 16, 8};
int target = 53;
sort(weights,weights + 8);
// for(int i = 0; i < 8; ++i)
// cout << weights[i] << " ";
int w2[3] = {2,4,6};
// subset_re(w2,3,6);
subset_re(weights,8,target);
subset_bk(weights,8,target);
// subset_bk(w2,3,6);
return 0;
}

【在 x********3 的大作中提到】
: 有一个排序之后的数组有n个元素,取其中k个元素使得他们的和为sum。问这样的组合
: 一共有多少种?
: 例如数组A=[1,2,4,5,7,8],取2个数和为9的一共有3种[1,8],[2,7]和[4,5]。
: 我的解法是递归。应该有更好的解法吧,因为我没有用到已排序这个特性,而且递归效
: 率蛮差的。多谢!

1 (共1页)
进入JobHunting版参与讨论
相关主题
自己总结了下什么时候用dp(循环),什么时候用递归boggle game是不是只有backtracking的解法?
问个G的电面题请教一个题目
求救, F家onsite算法题写了一个Queens的backtrack 大牛帮我看看
求3题思路问一道算法题
请教leetcode Subsets II这个题咋做?
被这几个题目搞混了Subset of size m Problem
请叫大家一道题问一到题目
共享一道电面题k-sum问一个cracking code interview上的问题啊
相关话题的讨论汇总
话题: int话题: sum话题: depth话题: target话题: selected