1 条题解

  • 0
    @ 2025-2-14 21:01:01

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N=20;
    int val[N][N],f[N][N]={0};
    /*这是一个典型的动态规划试题。用机器数来做状态,数组 F[I, J]表示前 I 个公司分配
    J 台机器的最大盈利。则状态转移方程为
    F[I, J]=Max{F[I-1, K] + Value[I, J-K]} ( 0〈 =K〈 =J〉*/
    void show(int,int); 
    int n,m,ans;
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)//val[i,j]~第i个分j个价值 
    		for(int j=1;j<=m;j++)
    		cin>>val[i][j];
    //边界f[0][0]=0;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			for(int k=0;k<=j;k++)
    			f[i][j]=max(f[i][j],f[i-1][k]+val[i][j-k]);
    	cout<<f[n][m]<<endl;
    	
    	ans=f[n][m];
    	show(n,m);		
    	return 0;	
    }
    
    void show(int i,int j){//输出分配情况
        int k;
        if(i==0)  return ;
    	for(int k=0;k<=j;k++)
    	if(ans==f[i-1][k]+val[i][j-k]){
    		ans=f[i-1][k];
    		show(i-1,k);
    		cout<<i<<" "<<j-k<<endl;
    		break;
    	}
    }
    

    Pascal :

    var
       m,n,i,j,k,max:longint; 
       f,a:array[0..10,0..15]of longint; 
    procedure print(i,j:longint); 
    var k:longint; 
    begin
      if i=0 then exit; 
      for k:=0 to j do
        if max=f[i-1,k]+a[i,j-k] then
          begin
            max:=f[i-1,k]; 
            print(i-1,k); 
            writeln(i,' ',j-k); 
            exit; 
          end; 
    end; 
    begin
      readln(n,m); 
      for i:=1 to n do
        for j:=1 to m do
          read(a[i,j]); 
      for i:=1 to n do
        for j:=1 to m do
          begin
            max:=0; 
            for k:=0 to j do
              if f[i-1,k]+a[i,j-k]>max 
               then max:=f[i-1,k]+a[i,j-k]; 
            f[i,j]:=max; 
          end; 
      writeln(f[n,m]); 
      print(n,m); 
    end. 
    
    • 1

    信息

    ID
    612
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者