1 solutions

  • 0
    @ 2025-3-3 16:24:09

    C :

    #include "stdio.h"
    int n,m;
    int a[10000],b[10000],c[10000],f[10001];
    int main()
    {
    	int i,j;
    	int k,s;
    	scanf("%d%d",&n,&m);
    	for(i=0;i<n;i++)
    		scanf("%d%d%d",&a[i],&b[i],&c[i]);
    	for(i=0;i<n;i++)
    	{
    		if(c[i]==0||c[i]*a[i]>=m)
    		{
    			for(j=a[i];j<=m;j++)
    				if(f[j-a[i]]+b[i]>f[j])
    					f[j]=f[j-a[i]]+b[i];
    		}
    		else
    		{
    			k=1,s=c[i];
    			while(k<s)
    			{
    				
    				for(j=m;j>=k*a[i];j--)
    					if(f[j]<f[j-k*a[i]]+k*b[i])
    						f[j]=f[j-k*a[i]]+k*b[i];
    					s-=k;
    					k*=2;
    			}
    			for(j=m;j>=s*a[i];j--)
    				if(f[j]<f[j-s*a[i]]+s*b[i])	
    					f[j]=f[j-s*a[i]]+s*b[i];
    		}
    	}
    	printf("%d\n",f[m]);
    	return 0;
    }
    

    C++ :

    
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    int m,n,f[10001]={0},w[10001],v[10001],p[10001];
    int a[10001],b[10001],l,r;
    void init();
    void work();
    void insert(int,int);
    int main()
    {
    	init();
    	work();
    	return 0;
    }
    void init()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>p[i];
    }
    void work()
    {
    	for(int i=1;i<=n;i++)
    	{
    		if(p[i]==0||p[i]>m/v[i])p[i]=m/v[i];
    		for(int d=0;d<v[i];d++)
    		{
    			l=1;
    			r=0;
    			for(int j=0;j<=(m-d)/v[i];j++)
    			{
    				insert(j,f[j*v[i]+d]-j*w[i]);
    				if(a[l]<j-p[i]) l++;
    				f[j*v[i]+d]=b[l]+j*w[i];
    			}
    		}
    	}
    	cout<<f[m]<<endl;
    }
    void insert(int x,int y)
    {
    	while(l<=r && b[r]<=y) r--;
    	r++;a[r]=x;b[r]=y;
    }
    
    • 1

    Information

    ID
    10018
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By