• 南阳325----zb的生日


     1 //重量太大,用01背包容易超时
     2 //数据只有20组。可以用dfs搜索最优解
     3 #include<stdio.h>
     4 int a[25];
     5 int maxs,n,s;
     6 void dfs(int,int);
     7 int main()
     8 {
     9     int i;
    10     while(~scanf("%d",&n))
    11     {
    12         for(i=s=0; i<n; ++i)
    13         {
    14             scanf("%d",a+i);
    15             s+=a[i];
    16         }
    17         maxs=0;
    18         dfs(0,0);
    19         printf("%d
    ",(s-maxs)-maxs);
    20     }
    21 }
    22 void dfs(int x,int sum)
    23 {
    24     if(x>n)
    25         return ;
    26     if(sum*2 <= s)
    27     {
    28         if(sum>maxs)
    29             maxs=sum;
    30     }
    31     else return ;
    32 
    33     dfs(x+1,sum);
    34     dfs(x+1,sum+a[x]);
    35 }
    36 
    37 //最优解,逆序剪枝
    38 #include <stdio.h>  
    39 #define max(a,b) a>b?a:b  
    40 int V,ans,n,w[21],sum[21];  
    41 void dfs(int i,int cnt)  
    42 {  
    43     if(i == 0)  
    44     {  
    45         ans = max(ans,cnt);  
    46         return ;  
    47     }  
    48     if(ans == V || cnt+sum[i] <= ans)       //cut  
    49         return ;  
    50     if(cnt+w[i] <= V)  
    51         dfs(i-1,cnt+w[i]);  
    52     dfs(i-1,cnt);  
    53 }  
    54 int main()  
    55 {  
    56     while(~scanf("%d",&n))  
    57     {  
    58         ans = 0;  
    59         for(int i=1;i<=n;i++)  
    60         {  
    61             scanf("%d",&w[i]);  
    62             sum[i] = sum[i-1] + w[i];  
    63         }  
    64         V = sum[n]/2;  
    65         dfs(n,0);  
    66         printf("%d
    ",sum[n]-2*ans);  
    67     }  
    68     return 0;  
    69 }
    70         
  • 相关阅读:
    三角形的最大周长
    Java 虚拟机运行时数据区详解
    四数相加 II
    Java 注解详解
    四因数
    【论文笔记+复现踩坑】End-to-end Recovery of Human Shape and Pose(CVPR 2018)
    假如 Web 当初不支持动态化
    保姆级干货分享
    C# ±180的值转成0-360
    C# 校验算法小结
  • 原文地址:https://www.cnblogs.com/qq188380780/p/6736816.html
Copyright © 2020-2023  润新知