1 条题解

  • 0
    @ 2025-4-12 21:33:54

    C :

    #include<stdio.h>
    #include<math.h>
    int c[6001],w[6001],p[6001];
    int f[6001];
    int N,M;
    int max(int x,int y)
    {
    	if(x<y) return y;
    	else return x;
    }
    int main()
    {
    	scanf("%d%d",&M,&N);
    	
    	for(int i=1;i<=N;++i)
    	{
    		scanf("%d%d%d",&w[i],&c[i],&p[i]);
    	}
    	
    	for(int i=1;i<=N;++i)
    	{
    		if(p[i]==0)
    		{
    			for(int j=w[i];j<=M;++j)
    			{
    				f[j]=max(f[j],f[j-w[i]]+c[i]);
    			}
    		}
    		else
    		{
    			for(int j=1;j<=p[i];++j)
    			{
    				for(int k=M;k>=w[i];--k)
    				{
    					f[k]=max(f[k],f[k-w[i]]+c[i]);
    				}
    			}
    		}
    	}
    	
    	printf("%d",f[M]);
    	
    	return 0;
    }
    
    

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int w[10000],c[10000],p[10000],f[10000],i,j,n,m,k;
    int main ()
    {
    	cin>>m>>n;
    	for (i=1; i<=n; i++)
    	  cin>>w[i]>>c[i]>>p[i];
    	for (i=1; i<=n; i++)
    	if (p[i]==0)
    	{
    		for (j=w[i]; j<=m; j++)
    		  f[j]=max(f[j],f[j-w[i]]+c[i]);
    	}
    	else 
    	{
    		for (j=1; j<=p[i]; j++)
    		  for (k=m; k>=w[i]; k--)
    		    f[k]=max(f[k],f[k-w[i]]+c[i]);
    	}
    	cout<<f[m];
    }
    
    

    Pascal :

    program zxt;
    var w,a,c,f:array [0..200] of integer;
        i,m,n,x:integer;
    function max(x,y:integer):integer;
    begin
      if x>y then max:=x else max:=y;
    end;
    procedure ling;
    var j:integer;
    begin
      for j:=m downto 1 do
        if j>=c[i] then f[j]:=max(f[j],f[j-c[i]]+w[i]);
    end;
    procedure wan;
    var j,k:integer;
    begin
      for j:=1 to m do
        for k:=1 to (m div c[i]) do
          if j>=k*c[i] then f[j]:=max(f[j],f[j-c[i]*k]+w[i]*k);
    end;
    procedure jj;
    var num,k:integer;
    begin
      num:=n;
        if c[i]*a[i]>m then a[i]:=m div c[i];
        k:=2;
        while k*2-1<=a[i] do
          begin
          inc(num);
          c[num]:=c[i]*k;
          w[num]:=w[i]*k;
          k:=k*2;
          a[num]:=1;
          end;
        k:=a[i]-k+1;
        if k>0 then
          begin
            inc(num);
            c[num]:=c[i]*k;
            w[num]:=w[i]*k;
            a[num]:=1;
          end;
        n:=num;
    end;
    begin
      readln(m,n);
      fillchar(f,sizeof(f),0);
      fillchar(a,sizeof(a),0);
      for i:=1 to n do
        readln(c[i],w[i],a[i]);
      x:=n;
      for i:=1 to x do
        if a[i]>1 then jj;
      x:=n;
      for i:=1 to x do
        if a[i]=0
          then wan
          else ling;
      writeln(f[m]);
    end.
    
    • 1

    信息

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