top1编程
← 返回题目
题解

【入门】环游世界之背包问题

1 条题解

  • 0
    @ 2026-7-29 0:19:17
    #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