- 论坛徽章:
- 0
|
对于序列A1,A2,A3...以及一个预设的和M,对于某个值An,假设:
S=A_i+...+A_n-1 <= M(若i不存在,则认为i=n, S=0)
则令S=S+A_n,其值有三种可能:
(1)S<M,则继续下一个值,累加入S
(2)S>M,则减去A_i, A_i+1...直至S<=M为止
(3)S=M,则得到一个连续和为M的子列,与到目前为止,最短的连续串(长度设为min_k)相比,以得到的min_k
最后就得到了和为M的最短连续子列
- int sub_sum(int *array, int n, int m, int *start)
- {
- int s=0, min_k=n+1, i, begin=0;
- for(i=0; i<n; i++) {
- s += array[i];
- while(s > m) s -= array[begin++];
- if(s == m && i-begin+1 < min_k) {
- min_k = i-begin+1;
- *start = begin;
- }
- }
- return min_k;
- }
复制代码
[ 本帖最后由 yzc2002 于 2006-2-15 11:23 编辑 ] |
|