@[maodan12345](/user/519384)
您可以参考我的代码
```cpp
#include <bits/stdc++.h>
using namespace std;
int dp[102][1003]={0};
struct p{
int time;
int vol;
}a[103];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].time>>a[i].vol;
}
for(int i=1;i<=m;i++){
for(int j=n;j>=0;j--){
if(a[i].time>j)dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].time]+a[i].vol);
}
}
cout<<dp[m][n];
}
```
by 幽灵特工 @ 2021-08-15 12:36:41
@[maodan12345](/user/519384)
您的代码少计算了j<a[i]的部分,这样会导致以后状态转移时可能会从一个没有被计算过的状态转移
by 幽灵特工 @ 2021-08-15 12:40:08
@[maodan12345](/user/519384) 把您的代码稍微改一改就过了。
具体改动处是,j循环终止条件,和状态转移方程。当a[i]>j的时候要f[i][j]=f[i-1][j]。其它不变
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=11000;
int a[N];
int w[N];
int f[N][N];
bool digit(char x)
{
return (x>='0' && x<='9');
}
inline int read()
{
int x=0;
int f=1;
char ch=getchar();
while(!digit(ch))
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(digit(ch))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int main()
{
int T;
T=read();
int n;
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
w[i]=read();
}
int ans=-1;
for(int i=1;i<=n;i++)
{
for(int j=T;j>=0;j--)
{
if(a[i]>j)f[i][j]=f[i-1][j];
else{
f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+w[i]);
ans=max(f[i][j],ans);}
}
}
cout<<ans;
return 0;
}
```
by 幽灵特工 @ 2021-08-15 12:43:42
感谢dalao讲解
明白了
还是对dp中的分类讨论和边界条件不理解qwq
by Link_Cut_Y @ 2021-08-15 18:24:41
其实就是没有考虑a[i]>j的情况
by Link_Cut_Y @ 2021-08-15 18:25:31
这样应该对了吧
```
#include<bits/stdc++.h>
using namespace std;
int time1;
int sum;
int c[10000],w[10000];
int f[10000];
int main()
{
cin>>time1>>sum;
for(int i=1;i<=sum;i++) cin>>c[i]>>w[i];
for(int i=1;i<=sum;i++)
{
for(int j=time1;j>=c[i];j--)
{
f[j]=max(f[j],f[j-c[i]]+w[i]);
}
}
cout<<f[time1];
return 0;
}
```
by Link_Cut_Y @ 2021-08-15 18:28:23
@[幽灵特工](/user/332549)
by Link_Cut_Y @ 2021-08-15 18:28:57
关注您了hhh
by Link_Cut_Y @ 2021-08-15 18:29:34
我才初二QAQ
by Link_Cut_Y @ 2021-08-15 18:30:10
@[maodan12345](/user/519384)
你还有很大的进步空间啊
我已经高二了,今年再不出成绩就退役了
by 幽灵特工 @ 2021-08-15 18:31:19