P5662 [CSP-J2019] 紀念品

纯粹的發表於2024-05-24

原題連結

題解

定義 \(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;
}

相關文章