就是背包01问题
#include<iostream>
#include<cstring>
/*01背包问题*/
using namespace std;
const int maxn = 120;
const int maxm = 1e5 + 10;
int dp[maxm],a[maxm];
int n,m;
int main()
{
int t; cin>>t;
while(t--)
{
cin>>n;
int sum=0;
//dp[j]表示在j范围下的最多可以有多少
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
//外层遍历物品
for(int i=1;i<=n;i++)
{
//内层遍历背包
for(int j=sum/2;j>=a[i];j--)
{
//递推公式,后面为当前减少a[i]的背包装的最大情况
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
//因为是一物品来判断的所以不能正向遍历
//那样会出现重复利用的情况,且小背包用来大背包是不能使用的
}
}
cout<< sum - 2*dp[sum/2] <<endl;
}
return 0;
}
标签:背包,int,1149,ZCMU,01,maxm,dp
From: https://www.cnblogs.com/hai-zei/p/18224670