主题:请教算法问题
xwlxwl
[专家分:0] 发布于 2010-02-24 15:20:00
有个问题想编程解决,可是苦于没有算法,虚心向大家求教,先谢谢了。
已知
a1的权重是b1;
a2的权重是b2;
a3的权重是b3;
a4的权重是b4;
...........
...........
aN的权重是bN; N=1250;
其中a1<a2<a3<a4<........<aN;
已知数值Total(Total>aN);
使 西格玛M(i)*A(i)<=Total,(其中M(i)为0或者自然数)
求MAX{西格玛M(i)*b(i)}的最大值
啰啰嗦嗦说这么多,不知说明白了没有。
回复列表 (共1个回复)
沙发
xwlxwl [专家分:0] 发布于 2010-02-25 06:42:00
在文件2.txt中有以下内容,其中第一行表示三角行的行数。
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
请编一程序,计算从顶至底某处的一条路径,使该路径经过的数字总和最大,要求每一步只能沿左斜线或右斜线向下走。(最长路径问题)
分析:该题相当于路径的求权问题.分析题意可知,对于三角形中任何一个不在最底行的结点M[i][j],它的下一步有且只有两条路径:M[i+1][j]与M[i+1][j+1].用一个数组last[]保存目前已经走过的权重最大的路径,用max保存其权值,用数组path[]保存当前刚走过的路径.这样,只需从左至右用递归的方法遍历该三角形,最终的last[]即为所求的路径.
下面的程序已经编译通过了,格式有点乱,自己改改啰。
#include <stdio.h>
#include <stdlib.h>
int b[2]={0,1},m;
int path[100],max=0,a[100][100],last[100];
void go1(int i,int j)
{int y,k,l;
path[i]=a[i][j];
for (k=0;k<2;k++)
{y=j+b[k];
if (i<m-1)
go1(i+1,y);
else
{int s=0;
for(l=0;l<m;l++)
s+=path[l];
if(s>max)
{max=s;
for(l=0;l<m;l++)
last[l]=path[l];
}
}
}
}
int main()
{FILE *fp;
int i,j;
system("cls");
fp=fopen("2.txt","r");/*假定文件位置在当前目录下*/
if(fp==NULL)
{printf("不能打开2.txt文件!");
exit(1);
}
fscanf(fp,"%d",&m);
for(i=0;i<m;i++)
for(j=0;j<=i;j++)
fscanf(fp,"%d",&a[i][j]);
go1(0,0);
for(i=0;i<m;i++)
printf("%3d ",last[i]);
printf("\nmax=%d\n",max);
system("pause");
return 0;
}
我来回复