关于我对dp公式的笔记
首先上代码
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<set> #include<cmath> using namespace std; int meme[5009];//用于存储解决第i个知识点所需要的时间 int kl[2][5009];//0存储问题编号并且被转换成解决时间,1存储解决奖励 int dp[5009][5009];//x代表已用去的时间,y代表 解决了y道题 int main() { int wek,lw,xl,sum; cin>>wek>>lw; int tpime=lw/wek; int m,n; cin>>m>>n; for(int i=1;i<=n;i++) { cin>>meme[i]; meme[i]*=tpime; } for(int i=1;i<=m;i++) { cin>>kl[0][i]>>kl[1][i]; kl[0][i]=meme[kl[0][i]]; } cin>>sum; for(int i=1;i<=m;i++) { for(int j=sum;j>=0;j--)//该状态下的剩余时间 { if(j>=kl[0][i])//如果剩余时间允许 { dp[i][j]=max(dp[i-1][j],dp[i-1][j-kl[0][i]]+kl[1][i]);//就像夺宝奇兵那道,由不选择 或者选择了两种转台选择 } else dp[i][j]=dp[i-1][j]; printf("%-4d",dp[i][j]); } cout<<endl; } for(int i=0;i<=m;i++) { for(int j=0;j<=sum;j++) printf("%-4d",dp[i][j]); cout<<endl; } cout<<dp[m][sum]<<endl; return 0; }
原题地址:P2430 严酷的训练 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
结果与打表图