1 条题解

  • 0
    @ 2024-10-19 20:39:20

    这道题有个很关键的隐藏信息,就是当选择一个食物烹饪的时候,会影响下一个食物的价值,和原本01背包选择顺序和物品价值无关不对,这时候我们就需要选择一个最优的dp路线,有点类似贪心。

    这里就找到了遍历的条件,就可以先对每个食物进行一个排序,确定最优的遍历路线。

    #include<bits/stdc++.h>
    
    using namespace std;
    typedef long long LL;
    
    const int N=100010;
    LL f[N];
    int n,t;
    
    struct P
    {
    	int a;
    	int b;
    	int c;
    }fd[N];
    
    bool cmp (P x, P y)
    {
    	return (LL)x.c*(LL)y.b<(LL)y.c*(LL)x.b;
    }
    
    int main()
    {
    	cin>>t>>n;
    	
    	for(int i=1;i<=n;i++) cin>>fd[i].a;
    	for(int i=1;i<=n;i++) cin>>fd[i].b;
    	for(int i=1;i<=n;i++) cin>>fd[i].c;
    	
    	sort(fd+1,fd+1+n,cmp);
    	
    	for(int i=1;i<=n;i++)
    		for(LL j=t;j-fd[i].c>=0;j--)//这里j得用LL
    		{
    			f[j]=max(f[j],f[j-fd[i].c]+fd[i].a-j*fd[i].b);
    		}
    	
    	LL res=0;
    	for(int i=1;i<=t;i++) res=max(f[i],res);
    	cout<<res;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    119
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    106
    已通过
    21
    上传者