zoukankan      html  css  js  c++  java
  • POJ 1014.Dividing

    2015-06-07

    问题简述:

      有六样物品,其值分别为1,2,3,4,5,6,现在有一部分这些物品,需要把这些物品分为两部分,输出是否能让这两部分的值总和相等。

      原题链接:http://poj.org/problem?id=1014

    解题思路:

      显然可以将所有物品值的总和加起来,以总和的一半为一个背包的限额,可以将这个问题转化为多重背包问题。但是这里我要使用另外一种方法----DFS。

      DFS:从最大值为6开始向下深搜,由于值为6的物品可能有很多个,所以下一个搜索仍然从6开始(当值为6的物品用完时,继续向下搜索)。

    源代码:

     1 /*
     2 OJ: POJ
     3 ID: 3013216109
     4 TASK: 1014.Dividing
     5 LANG: C++
     6 NOTE: DFS
     7 */
     8 #include <cstdio>
     9 
    10 int n[6],k=1,sum;
    11 
    12 bool dfs(int x) {
    13     if(x==sum/2) return true;    //如果正好搜索到总和的一半,则成功
    14     for(int i=5;i>=0;i--) {
    15         if(n[i]&&x+i+1<=sum/2) {
    16             n[i]--;
    17             if(dfs(x+i+1))
    18                 return true;    
    19         }
    20     }
    21     return false;
    22 }
    23 
    24 int main()
    25 {
    26     while(scanf("%d",&n[0])!=EOF) {
    27         sum=n[0];
    28         for(int i=1;i<6;i++) {
    29             scanf("%d",&n[i]);
    30             sum+=(n[i]*(i+1));
    31         }
    32         if(sum==0) break;
    33         printf("Collection #%d:\n",k++);
    34         if(sum%2==1) {
    35             printf("Can't be divided.\n\n");
    36             continue;
    37         }
    38         if(dfs(0))
    39             printf("Can be divided.\n\n");
    40         else
    41             printf("Can't be divided.\n\n");
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    《人月神话》阅读笔记02
    《人月神话》阅读笔记01
    第十四周学习进度条
    我们做的作品 请大家多多支持我们
    Beta阶段项目总结
    Alpha阶段项目总结
    Alpha版总结会议
    站立会议10(第二次冲刺)
    站立会议09(第二次冲刺)
    站立会议08(第二次冲刺)
  • 原文地址:https://www.cnblogs.com/ACMans/p/4559599.html
Copyright © 2011-2022 走看看