NC54633. [CSP2019]纪念品
描述
输入描述
第一行包含三个正整数 T,N,M,相邻两数之间以一个空格分开,分别代表未来天数 T,纪念品数量 N,小伟现在拥有的金币数量 M。
接下来 T 行,每行包含 N 个正整数,相邻两数之间以一个空格分隔。第 𝑖 行的 N 个正整数分别为 , , ,,其中 表示第 𝑖 天第 𝑗 种纪念品的价格。
输出描述
输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量
示例1
输入:
6 1 100 50 20 25 20 25 50
输出:
305
说明:
最佳策略是:示例2
输入:
3 3 100 10 20 15 15 17 13 15 25 16
输出:
217
说明:
最佳策略是:C++(clang++11) 解法, 执行用时: 24ms, 内存消耗: 480K, 提交时间: 2020-10-25 20:54:18
#include<bits/stdc++.h> using namespace std; int t,n,m,i=1,j,k,a[101][101],f[10001]; int main() { cin>>t>>n>>m; for(;i<=t;i++) for(j=1;j<=n;j++) cin>>a[i][j]; for(i=1;i<t;i++) { memset(f,0,sizeof f); for(j=1;j<=n;j++) for(k=a[i][j];k<=m;k++) f[k]=max(f[k],f[k-a[i][j]]+a[i+1][j]-a[i][j]); m+=f[m]; }cout<<m; }
C++14(g++5.4) 解法, 执行用时: 28ms, 内存消耗: 632K, 提交时间: 2020-10-09 08:58:58
#include<bits/stdc++.h> using namespace std; int t,n,m,i=1,j,k,a[101][101],f[10001]; main() { cin>>t>>n>>m; for(;i<=t;i++) for(j=1;j<=n;j++) cin>>a[i][j]; for(i=1;i<t;i++) { memset(f,0,sizeof f); for(j=1;j<=n;j++) for(k=a[i][j];k<=m;k++) f[k]=max(f[k],f[k-a[i][j]]+a[i+1][j]-a[i][j]); m=f[m]+m; }cout<<m; }