zoukankan      html  css  js  c++  java
  • zoj 3631 Watashi's BG

    0、1背包,直接做会超时。做了这题我才知道,01背包是能用搜索做的,搜索的时候剪枝很重要。

    (几个月后……)

    光棍节前夕,小T同志来找我,说他遇到了一个题解,里面说是受别人代码的启发,并附上原址,点开一看,居然是我?!我姓福了。真的很感谢这位兄弟,他尊重产权,更重要的是给了我信心。本来我都快要放弃了,现在我又坚定了信念,一定要好好搞下去。说实话,他的博客写得比我好,因为他详细地写出了思路。这时候小T 吐槽了:“其实你也是抄的。”好吧,我受之有愧,我是参考了江财大牛的思路,不过我的代码已经和他的不一样了,核心部分DFS做了逻辑上的改动。

     1 #include <stdio.h>
     2 #include <algorithm>
     3 using namespace std;
     4 int m,n,ans;
     5 int a[35];
     6 bool cmp(int a,int b)
     7 {
     8     return a > b ;
     9 }
    10 void dfs(int i,int sum)
    11 {
    12     int j,k;
    13     //printf("%d %d\n",i,sum);
    14     if(ans == m) return;//相当于if(find)
    15     if(sum > ans) ans = sum;
    16     if(i >= n) return ;
    17     for(j = i, k = sum; j < n; j++)
    18         k += a[j];
    19     if(k <= ans) return;
    20     if(sum+a[i] <= m)
    21         dfs(i+1,sum+a[i]);
    22     dfs(i+1,sum);
    23 }
    24 int main()
    25 {
    26     int i;
    27     while(~scanf("%d%d",&n,&m))
    28     {
    29         for(i = ans = 0; i < n; i++)
    30             scanf("%d",&a[i]),
    31             ans += a[i];
    32         if(ans <= m)
    33         {
    34             printf("%d\n",ans);
    35             continue;
    36         }
    37         sort(a,a+n,cmp);
    38         ans = 0;
    39         dfs(0,0);
    40         printf("%d\n",ans);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    平方十位数
    随意组合
    显示二叉树
    四阶幻方
    方格填数
    数字排列
    青蛙跳N阶(变态跳)
    Mysql可重复读、避免幻读原理
    动态规划典型例题--连续子数组的最大和
    行列有序的二维数组查找
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/2661251.html
Copyright © 2011-2022 走看看