//dp数组含义: dp[j]是用j单位时间采到的最大价值
/*/状态转移方程:dp[j]=max(
不采:dp[j],
采:dp[j-Time[i]]+jiazhi[i]
)
*/
//dp数组初始化:0
/*遍历顺序:
for(int i=0;i<m;i++)
{
for(int j=t;j>=Time[i];j++)
{
}
}
*/
#include<bits/stdc++.h>
using namespace std;
int t,m;
int Time[10005],jiazhi[10005];
int dp[10005];
int main()
{
cin>>t>>m;
for(int i=0;i<m;i++) cin>>Time[i]>>jiazhi[i];
for(int i=0;i<m;i++)
{
// cout<<"i=="<<i<<"\n";
for(int j=t;j>=Time[i];j++)
{
// cout<<"\tj=="<<j<<"\n";
// cout<<"\t\tdp["<<j<<"]=="<<dp[j]<<"\n";
// cout<<"\t\tdp["<<j<<"-Time["<<i<<"]("<<Time[i]<<")]+jiazhi["<<i<<"]("<<jiazhi[i]<<")=="<<dp[j-Time[i]]+jiazhi[i]<<"\n";
dp[j]=max(dp[j],dp[j-Time[i]]+jiazhi[i]);
// cout<<"\t\tnow dp["<<j<<"]=="<<dp[j]<<"\n";
// cout<<"\t\tdp[]==";
// for(int i=0;i<t;i++) cout<<dp[i]<<' ';
// cout<<endl;
}
}
// for(int i=0;i<t;i++) cout<<dp[i]<<' ';
// cout<<endl;
cout<<dp[t];
return 0;
}
听取RE声一片
我加了好多调试 发现:
i==0
i==1
j==70
dp[70]==0
dp[70-Time[1](69)]+jiazhi[1](1)==1
now dp[70]==1
dp[]==0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
j==71 //???????????????????
dp[71]==0
dp[71-Time[1](69)]+jiazhi[1](1)==1
now dp[71]==1
dp[]==0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
j==72 //???????????????????
dp[72]==0
dp[72-Time[1](69)]+jiazhi[1](1)==1
now dp[72]==1
dp[]==0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
j怎么在增加???
——————警钟长鸣—————— for(int j=t;j>=Time[i];j++)
#### j++ ????????
————————————————
为了防止抄袭把j++改成j--就能AC了
祝大家不辜负自己学IT的每一个夜晚
不要犯我这种错误
手敲击键盘的每一下 都会化为点点星光 助力我们奔赴NOI之梦 谢谢大家
求关求关