标签:blog os 使用 ar for div art 问题 log
第一个问题可以抽象为这样:给定一个数组A,和一个数t,用数组里的一些数求和得到t,数组里的数可以重复使用,写一个算法,使得使用A中最少的数来表示t。
比如:[2,4,6,9],18==>[9,9]
dfs问题
//numbers要从大到小,一个sort搞定,result存放结果
bool dfs(vector<int>& numbers,int gap,int start,vector<int> &result)
{
if(0 == gap)
{
return true;
}
bool r = false;
for(int i = start; i < numbers.size(); ++i)
{
if(gap < numbers[i])
continue;
result.push_back(numbers[i]);
r = dfs(numbers,gap-numbers[i],i,result);
if(!r)
{
result.pop_back();
}else
{
return r;
}
}
return r;
}
还有一个题是说给定若干有序区间,求第k个数,感觉可以用二分法做,但是没想出来,所以就进行遍历,时间复杂度为O(n)
void kth(vector<vector<int> > &numbers, vector<int> &pos,int k, int &result)
{
if(0 == k)
return ;
int index = 0;
int min = INT_MAX;
int indexx = -1;
for(;index < numbers.size(); ++index)
{
if(pos[index] != -1 && numbers[index][pos[index]] < min)
{
min = numbers[index][pos[index]];
indexx = index;
}
}
result = min;
++pos[indexx];
if(pos[indexx] == numbers[indexx].size())
{
pos[indexx] = -1;
}
kth(numbers,pos,k-1,result);
}
int getkth(vector<vector<int> > &numbers, int k)
{
vector<int> pos(numbers.size(),0);
int result = -1;
kth(numbers,pos,k,result);
cout<<result<<endl;
return result;
}
标签:blog os 使用 ar for div art 问题 log
原文地址:http://www.cnblogs.com/dy-techblog/p/3980125.html