```
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
typedef unsigned long long ULL;
typedef pair<long long,int> PLI;
const int N = 110;
int t,m;
int f[N][1010],a[N],b[N];
int main()
{
ios::sync_with_stdio(false);
cin>>t>>m;
for(int i=1;i<=m;i++){
cin>>a[i]>>b[i];
}
for(int i=1;i<=m;i++){
for(int j=t;j>=0;j--){
if(j>=a[i]){
f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+b[i]);
}
else f[i][j]=f[i-1][j];
}
}
cout<<f[m][t];
return 0;
}
```
为啥这样就对了,这不是和上面的一样吗。
by aaaaaagf @ 2023-08-06 15:29:09
因为第一个到了a[i]之后f[i][j]就不赋值了呀qwq
by chengyilin @ 2023-08-08 10:52:25
@[chengyilin](/user/1045924)
可是第二个到了j小于a[i]的话是f[i][j]=f[i-1][j],表示不选这个物品,那么后面的不是直接等于这个了吗。这样就和第一个没区别呀
by aaaaaagf @ 2023-08-08 15:36:33
@[aaaaaagf](/user/897276) 第一个到了$a_i$之后,f[i][j]没有=f[i-1][j],而第二个等于了
by S_Z_Xcoco @ 2023-08-09 10:55:26
@[aaaaaagf](/user/897276) 直接送你代码
```
#include<bits/stdc++.h>
using namespace std;
int f[1005] , c[1005] , w[1005] , n , v ;
int main()
{
cin >> v >> n ;
for(int i = 1 ; i <= n ; i ++ ){
cin >> c[i] >> w[i] ;
}
for(int i = 1 ; i <= n ; i ++ ){
for(int j = v ; j >= 1 ; j -- ){
if(j >= c[i]){
f[j]=max(f[j],f[j-c[i]]+w[i]);
}
}
}
cout << f[v] ;
return 0;
}
by mzh98K @ 2023-08-20 09:45:28
~~楼主马蜂有些奇特~~
by zhz2013 @ 2023-08-27 21:54:47
感谢,此贴结。
by aaaaaagf @ 2023-08-31 16:17:22