1 条题解

  • 0
    @ 2024-12-12 8:12:21

    题解

    可以分两种情况,第一种用终结技,第二种不用终结技,不用终结技直接跑背包即可,用终结技,可以在最后背包体积先减去 ana_n ,然后终结技等效于前 n1n-1 张攻击牌,每张攻击牌造成的伤害数加 kk 。再跑一遍背包,两者取较大值即可。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    long long k,ans;
    int a[114514];
    long long b[114514];
    long long dp[114514];
    void solve1()
    {
    	for(int i=1;i<=n-1;i++)
    		for(int j=m;j>=a[i];j--)
    		dp[j]=max(dp[j],dp[j-a[i]]+b[i]),ans=max(ans,dp[j]);
    }
    void solve2()
    {
    	memset(dp,0,sizeof(dp));
    	for(int i=1;i<=n;i++)
    		for(int j=m-a[n];j>=a[i];j--)
    		dp[j]=max(dp[j],dp[j-a[i]]+k+b[i]),ans=max(ans,dp[j]);
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m>>k;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<n;i++)cin>>b[i];
    	solve1();
    	solve2();
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    282
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    83
    已通过
    7
    上传者