免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2529 | 回复: 10
打印 上一主题 下一主题

请教一个关于"求和"的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-14 23:19 |只看该作者 |倒序浏览
已知有一个数组X[1],X[2],...,X[n],求k个元素乘积的和,具体内容请见附件的图片"计算式"(math.PNG),用Word做的。


  1. double value=0;
  2. for(int i1=1;i1<n;i1++){
  3.         for(int i2=i1+1;i2<n;i2++){
  4.                 for(int i3=i2+1;i3<n;i3++){
  5.                         ......{
  6.                                 value+=x[i1]*x[i2]*...*x[ik];
  7.                         }
  8.                 }
  9.         }
  10. }
复制代码

这样设计需要k个for()循环,无法硬编码实现,请各位帮帮忙吧。
在这里先谢过了!

论坛徽章:
0
2 [报告]
发表于 2006-10-15 16:46 |只看该作者
数学变形。

double value = 1;
double sum = 0;
for (int i = n; i > 0; i--) {
    sum += a[i];
    if (i <= k)
        value *= sum;
}

我验证下。

论坛徽章:
0
3 [报告]
发表于 2006-10-15 18:00 |只看该作者
见附件

fomula.jpg (76.27 KB, 下载次数: 30)

fomula

fomula

论坛徽章:
0
4 [报告]
发表于 2006-10-16 17:04 |只看该作者
楼主是什么意思啊???是 1 + 1*2 + 1*2*3 +1*2*3*4 +1*2*3*4*5  ......吗?????
                                            3             9               33              153
是的话,我的程序是这样的,
                double value = 1;
                double sum=0;
                for(int i=0;i<=a.length-1;i++)
                {
                    value *= a[i];
                        sum += value;
                }

精灵的程序是什么意思啊?没看懂

论坛徽章:
0
5 [报告]
发表于 2006-10-16 19:49 |只看该作者
等式最后一行就是

论坛徽章:
0
6 [报告]
发表于 2006-10-17 20:34 |只看该作者

对问题进一步说明

谢谢各位的讨论和给出解决方案。
我对于自己没有把问题说清楚表示道歉。
实际上是这样的:

给出N个数据,需要求出任意k个数据的乘积,然后求和,但是不能出现重复的啊。
就象上面给出的An*An是不应该出现的。

例如:
对于数据 1,2,3,4
k=1时 sum=1+2+3+4
k=2时 sum=1*2+1*3+1*4+2*3+2*4+3*4
k=3时 sum=1*2*3+1*2*4+1*3*4+2*3*4
k=4时 sum=1*2*3*4

但是当数据量增大时:1,2,3,4,5,6,7,8...数据项会很多的。

这个原型是概率论里面的事件并的出现概率。
例如有事件A1,A2,A3
事件P(A1 or A2 or A3)=[P(A1)+P(A2)+P(A3)] - [P(A1)P(A2)+P(A1)P(A3)+P(A2)P(A3)] +[P(A1)P(A2)P(A3)]
我为了方便处理,各项都使用了求和。因为当 k%2==1 使用 + ;当 k%2==0 使用 -
如果各位能够了解我的问题之所在,给出一些建议,不胜感激。
直接使用"+/-"交替的式子来求最好了。

论坛徽章:
0
7 [报告]
发表于 2006-10-17 22:57 |只看该作者
P(A)=P(A)

P(A or B)=P(A)+P(B)-P(A)P(B)

P(A or B or C)=[P(A)+P(B)-P(A)P(B)]+P(C)-[P(A)+P(B)-P(A)P(B)]P(C)
=P(A)+P(B)+P(C)-[P(A)P(B)+P(A)P(C)+P(B)P(C)]+P(A)P(B)P(C)

P(A or B or C or D)=A+B+C+D-(AB+BC+AC+AD+BD+CD)+
(ABC+ABD+BCD+ACD)-ABCD

记S(n,k)为n个数中不重复的k个数的乘积的总和,则有:
P(A[1] or ... or A[N])=S(N,1) - S(n,2) + S(n,3) - ... +/- S(n,n)

这样对了吧,我试试

论坛徽章:
0
8 [报告]
发表于 2006-10-17 23:12 |只看该作者
蛮力来做得话,时间复杂度达到阶乘级别,重复计算巨大,考虑用空间换取时间,用动态规划。

fomula2.jpg (4.98 KB, 下载次数: 27)

fomula2.jpg

论坛徽章:
0
9 [报告]
发表于 2006-10-18 10:15 |只看该作者
如果只考虑"给出N个数据,需要求出任意k个数据的乘积,然后求和,但是不能出现重复的啊。"
楼主的问题转化为: 从N个数中, 求得K个数的组合, 将每一个组合内的数求积, 并求所有组的积的和.

算法的主要问题是如何求组合. 我用C++写了一个程序, 能解决楼主的"给出N个数据,需要求出任意k个数据的乘积,然后求和,但是不能出现重复的啊。"问题.


  1. #include <stdio.h>

  2. #define NLEN 4
  3. #define KLEN 3

  4. int main(int argc, char *argv[]){
  5.         long N[NLEN];
  6.         for(long t=0; t<NLEN; t++){
  7.                 //在这里初始化N个数.
  8.                 N[t] = t+1;
  9.         }
  10.        
  11.         long sum = 0;
  12.         for(int index=0; index<=NLEN-KLEN; index++){
  13.                 long groupsum = 1;
  14.                 for(int i=index; i<index+KLEN; i++){
  15.                         groupsum *= N[i];
  16.                 }
  17.                 sum += groupsum;
  18.                
  19.                 for(int j=index+1; j<index+KLEN; j++){
  20.                         long temp = groupsum / N[j];
  21.                         for(int k=index+KLEN; k<NLEN; k++){
  22.                                 sum += temp * N[k];
  23.                         }
  24.                 }
  25.         }
  26.         printf("\n%d\n", sum);
  27. }
复制代码

[ 本帖最后由 ideawu 于 2006-10-18 10:21 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-10-18 14:54 |只看该作者
嘿嘿,还是这样吧。以两个为例:
P(A or B) = 1 - P(not (A and B)) = 1 - (1-P(A))(1-P(B))
是不是这回事啊 ><  ><
P(A1 or A2 or ... An) = 1 - (1 - P(A1))(1 - P(A2))...(1 - P(An))
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP