背包变形,变成了每次都加A[I],但是B[I]只加一次。一开始直接写了多重背包,后来发现b【i】加多了。后想想的确是想麻烦了。完全可以直接先01把两个都背一次。然后再完全背包只背a就ok了、
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int w[1010],a[1010],b[1010];
int dp[2010];
int main()
{
int t;scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
int m,n;scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)scanf("%d%d%d",&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 j=w[i];j<=m;j++)
dp[j]=max(dp[j],dp[j-w[i]]+a[i]);
}
printf("%d\n",dp[m]);
}
return 0;
}