P5662 [CSP-J2019] 纪念品

原题链接

题解

定义 \(dp[i]\) 为今天有 \(i\) 元钱花时,明天卖能纯赚多少钱(这里有一个递归的思想,不需要考虑 \(dp[k-a[i][j]]\) 能否买得起今天的产品)
如果 \(dp[i-1]=k\) 那么 \(dp[i]\geq k\) ,所以存在一个 \(i\) 使得钱全部花完然后赚 \(k\)

code

#include<bits/stdc++.h>
using namespace std;
int dp[10005]={0};
int a[105][105];
int main()
{
    int t,n,m;
    cin>>t>>n>>m;

    for(int i=1;i<=t;i++)
    {
        for(int j=1;j<=n;j++) cin>>a[i][j];
    }

    int maxs=m;
    for(int i=1;i<t;i++)
    {
        memset(dp,0,sizeof dp);
        int add=0;
        for(int j=1;j<=n;j++)
        {
            for(int k=a[i][j];k<=maxs;k++)
            {
                dp[k]=max(dp[k],dp[k-a[i][j]]+a[i+1][j]-a[i][j]);
                add=max(add,dp[k]);
            }
        }
        maxs+=add;
    }

    cout<<maxs;
    return 0;
}

posted @ 2024-05-24 20:53  纯粹的  阅读(48)  评论(0)    收藏  举报