zoukankan      html  css  js  c++  java
  • TMOOC-1692-分西瓜

    题目

    描述

    今天是阴历七月初五,首师大附中信息社团队员GDC的生日。GDC正在和SCX、WXY在首师大附中集训。他想给这两位兄弟买点什么庆祝生日,经过调查,GDC发现SCX和WXY都很喜欢吃西瓜,而且一吃就是一堆的那种,GDC立刻下定决心买了一堆西瓜。当他准备把西瓜送给SCX和WXY的时候,遇到了一个难题,WXY和SCX不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?

    输入

    输入多组测试数据(<=1500)。数据以EOF结尾,第一行输入西瓜数量N (1 ≤ N ≤ 20)
    第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量。

    输出

    输出分成两堆后的质量差。

    输入示例

    5
    5 8 13 27 14
    

    输出示例

    3
    

    思路

    要使两边之差较小,也就是要尽量让两边的数挨近sum/2(sum为总量)就可以了。只需做一个以sum/2为容量的背包即可。另一边的重量是sum-dp[sum/2]。
    那么,最终的差就是:sum-dp[sum/2]-(dp[sum/2])=sum-dp[sum/2]*2;

    DFS做法

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #define max(a,b) a>b?a:b 
    using namespace std;
    int n,a[21],ans,sum[21],V;
    void dfs(int i,int cnt){
    	if(i==0){
    		ans=max(ans,cnt);
    		return ;
    	}
    	if(ans==V||cnt+sum[i]<=ans)return ;
    	if(cnt+a[i]<=V)dfs(i-1,cnt+a[i]);
    	dfs(i-1,cnt);
    }
    int main(){
    	while(cin>>n&&n){
    		ans=0;
    		for(int i=1;i<=n;i++)cin>>a[i],sum[i]=sum[i-1]+a[i];
    		V=sum[n]/2;
    		dfs(n,0);
    		cout << (sum[n]-2*ans) << endl;
    	}
    	return 0;
    }
    
    

    DP做法

    #include<iostream>
    #include<cstring>
    using namespace std;
    int n,w[21],dp[200001],v,sum=0;
    int max(int x,int y){return x>y?x:y;}
    int main(){
    	while(cin>>n){
    		sum=0;
    		memset(dp,0,sizeof(dp));
    		for(int i=1;i<=n;i++)cin>>w[i],sum+=w[i];
    		v=sum/2;
    		for(int i=1;i<=n;i++){
    			for(int j=sum;j>=w[i];j--){
    				dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
    			}
    		}
    		cout << (sum-dp[v]*2) << endl;
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    Power of Cryptography
    Radar Installation
    Emag eht htiw Em Pleh
    Help Me with the Game
    89. Gray Code
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/dmoransky/p/10742619.html
Copyright © 2011-2022 走看看