HDU - 5410

题目链接:HDU - 5410


因为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;
}

你可能感兴趣的:(动态规划,背包问题,HDU)