1 条题解

  • 0
    @ 2025-2-14 21:20:41

    C :

    #include "stdio.h"
    int n,m;
    int a[11][16],b[11],f[11][16];
    int main()
    {
    	int i,j,k;
    	scanf("%d%d",&n,&m);
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    			scanf("%d",&a[i][j]);
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    		{
    			f[i][j]=f[i-1][j];
    			for(k=1;k<=j;k++)
    				if(f[i][j]<f[i-1][j-k]+a[i][k])
    					f[i][j]=f[i-1][j-k]+a[i][k];
    		}
    	}
    	printf("%d\n",f[n][m]);
    	for(i=n;i>=1;i--)
    	{
    		for(j=m;j>=0;j--)
    			if(f[i][m]==f[i-1][m-j]+a[i][j])
    			{
    				b[i]=j;
    				m-=j;
    				break;
    			}
    	}
    	for(i=1;i<=n;i++)
    		printf("%d %d\n",i,b[i]);
    	return 0;
    }
    

    C++ :

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <climits>
    
    using namespace std;
    
    int F[11][16];
    int V[11][16];
    int Ans=0,N,M;
    void init(void);
    void Work(void);
    int Prim(int,int);
    
    int main()
    {	
    	init();
    	Work();
    	
    	return 0;
    }
    
    void init(void)
    {
    	memset(F,0,sizeof(F));
    	memset(V,0,sizeof(V));
    	
    	int i,j;
    	
    	scanf("%d %d",&N,&M);
    	
    	for(i=1;i<=N;i++)
    	{
    		for(j=1;j<=M;j++)
    		{
    			scanf("%d",&V[i][j]);
    		}
    	}
    }
    
    void Work(void)
    {
    	int i,j,k;
    	
    	for(i=1;i<=N;i++)
    	{
    		for(j=1;j<=M;j++)
    		{
    			Ans=0;
    			
    			for(k=0;k<=j;k++)
    			{
    				if(F[i-1][k]+V[i][j-k]>Ans)
    				{
    					Ans=F[i-1][k]+V[i][j-k];
    				}
    			}
    			
    			F[i][j]=Ans;
    		}
    	}
    	
    	printf("%d\n",F[N][M]);
    	
    	Prim(N,M);
    }
    
    int Prim(int x,int y)
    {
    	int i,j;
    	
    	if(x==0) return 0;
    	
    	for(i=0;i<=y;i++)
    	{
    		if(Ans==F[x-1][i]+V[x][y-i])
    		{
    			Ans=F[x-1][i];
    			Prim(x-1,i);
    			printf("%d %d\n",x,y-i);
    			break;
    		}
    	}
    }
    

    Java :

    import java.util.*;
    public class Main{
    
    	static int n,m;
    	static int[] f = new int[20];
    	static int[][] w = new int[20][20];
    	static int[][] ans = new int[20][20];
    
    	public static void main(String args[]) {
    		Scanner sc = new Scanner(System.in);
    		int i,j,k;
    		n = sc.nextInt();
    		m = sc.nextInt();
    	    for (i=1;i<=n;++i)
    	    {
    	        for (j=1;j<=m;++j)
    	        {
    	            w[i][j] = sc.nextInt();
    	        }
    	    }
    
    	    for (i=n;i>0;--i)
    	    {
    	        for (j=m;j>=0;--j)
    	        {
    	            for (k=1;k<=j;++k)
    	            {
    	                if (f[j-k]+w[i][k]>f[j])
    	                {
    	                    f[j]=f[j-k]+w[i][k];
    	                    ans[i][j]=k;    //保存f(i,j)取最大时k的值
    	                }
    	            }
    	        }
    	    }
    
    	    System.out.print(f[m]);
    
    	    for (i=1,j=m;i<=n;++i)
    	    {
    	    	System.out.println();
    	    	System.out.print(i+" "+ans[i][j]);
    	        j-=ans[i][j];   //算出最优方案第i+1~n公司共使用了几台机器,也就是f(i,j)是由f(i+1,?)转移过来的
    	    }
    
    	}
    	
    	
    }
    
    
    
    • 1

    信息

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