ZCMU-1149

image
image

就是背包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; 
}
posted @ 2024-05-31 15:34  海&贼  阅读(10)  评论(0)    收藏  举报