关于我对dp公式的笔记


首先上代码

#include
#include
#include
#include
#include
#include
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< }
for(int i=0;i<=m;i++)
{
for(int j=0;j<=sum;j++)
printf("%-4d",dp[i][j]);
cout< }

cout< return 0;
}

原题地址:P2430 严酷的训练 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

结果与打表图