回 帖 发 新 帖 刷新版面

主题:请教算法问题

有个问题想编程解决,可是苦于没有算法,虚心向大家求教,先谢谢了。

已知
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个回复)

沙发


在文件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;



我来回复

您尚未登录,请登录后再回复。点此登录或注册