• 南阳325--zb的生日


    zb的生日

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:2
     
    描述
    今天是阴历七月初五,acm队员zb的生日。zb正在和C小加、never在武汉集训。他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜。当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?
     
    输入
    多组测试数据(<=1500)。数据以EOF结尾
    第一行输入西瓜数量N (1 ≤ N ≤ 20)
    第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
    输出
    输出分成两堆后的质量差
    样例输入
    5
    5 8 13 27 14
    样例输出
    3
    来源
    ural
    上传者
    李文鑫
    //dp:
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #define max(a,b) a>b?a:b 
     5 using namespace std ;
     6 int main()
     7 {
     8     int num[25] ;
     9     int dp[100005] ;
    10     int i, j, n ;
    11     while(~scanf("%d", &n))
    12     {
    13         memset(dp, 0,sizeof(dp)) ;
    14         int sum = 0 ;
    15         for(i=0; i<n; i++)
    16         {
    17             scanf("%d",&num[i]) ;
    18             sum += num[i] ;
    19         }
    20         for(i=0; i<n; i++)
    21         {
    22             for(j = sum/2; j >= num[i]; j--)
    23             {
    24                 dp[j] = max(dp[j], dp[j-num[i]]+num[i]) ;
    25             }
    26         }
    27         printf("%d
    ", sum - 2*dp[sum/2]) ;
    28     }
    29     return 0 ;
    30 }

    //搜索真难懂,摘自讨论区:

     1 #include <iostream>
     2 #include <string>
     3 #include <stdio.h>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 using namespace std;
     7 
     8 const int WATER_MELON = 25;
     9 const int MAX_WEIGHT = 10005;
    10 
    11 int n;//西瓜个数
    12 int sum;
    13 int w[WATER_MELON];
    14 int result;
    15 
    16 bool HandleEachCase();
    17 
    18 int main()
    19 {
    20     while(HandleEachCase())
    21     {
    22         //empty while
    23     }
    24 }
    25 
    26 void dfs(int iStep, int iSum);
    27 
    28 bool HandleEachCase()
    29 {
    30     if(!(cin>>n))
    31     return false;
    32     sum = 0;
    33     for(int i= 0; i< n; ++i)
    34     {
    35         cin>>w[i];
    36         sum+=w[i];
    37     }
    38     result = sum;
    39     dfs(0, 0);
    40     cout<<result<<endl;
    41     return true;
    42 }
    43 
    44 void dfs(int iStep, int iSum)
    45 {
    46     if(iSum >= (sum>>1) && abs(sum - (iSum<<1))>= result)  //比当前最优解要差    
    47     return;
    48     if(iStep == n)
    49     {//当前的最优解
    50 /*result = abs(sum - (iSum<<1));*/
    51         if(abs(sum-(iSum<<1))< result)    
    52         result = abs(sum-(iSum<<1));
    53         return;
    54     }
    55     dfs(iStep+1, iSum+w[iStep]);
    56     dfs(iStep+1, iSum);
    57 } 
    View Code
  • 相关阅读:
    当你不知道今天星期几,不妨在编辑器写下这段代码
    自定义注解!绝对是程序员装逼的利器!!
    什么是可串行化MVCC
    Jetpack新成员,一篇文章带你玩转Hilt和依赖注入
    连接真机开发安卓(Android)移动app MUI框架 添加购物车等——混合式开发(四)
    从前世今生聊一聊,大厂为啥亲睐时序数据库
    工作五年,面试官说我只会CRUD!竟然只给我10K!
    bootstrap知识总结
    数据处理的两个基本问题05 零基础入门学习汇编语言42
    转移指令的原理02 零基础入门学习汇编语言44
  • 原文地址:https://www.cnblogs.com/soTired/p/4671531.html
Copyright © 2020-2023  润新知