因为B为正,所以我们可以将一个物品拆成两个,一个价值为a+b的单一物品,一个价值为a的完全物品。
然后两次背包即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=2e3+10;
int n,m,w[N],a[N],b[N],dp[N];
void solve(){
cin>>m>>n; memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++) cin>>w[i]>>a[i]>>b[i];
for(int i=1;i<=n;i++) for(int j=m;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+a[i]+b[i]);
for(int i=1;i<=n;i++) for(int j=w[i];j<=m;j++) dp[j]=max(dp[j],dp[j-w[i]]+a[i]);
cout<<dp[m]<<'\n';
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}