zoukankan      html  css  js  c++  java
  • hdu 1270

    类型:递推求解

    代码附下:

     1 //wrong1  产生的和有两个相同的
     2 //wrong2  visti标记数组标记错误
     3 #include <iostream>
     4 #include <cstring>
     5 using namespace std;
     6 int N, nN, sum[10010], num[110];
     7 bool visit[10010];
     8 bool ok(){   //num[1], num[2], num[3]假设已经确定,
     9             //则num[1] + num[4]必定在区间sum(3, nN)中未被标记的第一个数
    10     int i, j = 3, k, t;
    11     for(i = 4; i <= N; ++i){
    12         while(visit[j]) j++;
    13         if(j > nN) break;
    14         num[i] = sum[j] - num[1]; //find num[i] (3 < i <= N)
    15         visit[j] = true;          //标记sum[j];
    16         for(k = 2; k < i; ++k){   //标记num[i] 与 num[2, i-1]的和,并判断和是否存在,若不存在,结束
    17             for(t = j + 1; t <= nN; ++t)
    18                 if(!visit[t] && num[i] + num[k] == sum[t]){
    19                     visit[t] = true; break;
    20                 }
    21             if(t > nN) return false;//若不存在,结束
    22         }
    23     }
    24     return true;
    25 }
    26 
    27 int main()
    28 {
    29     while(cin>>N){
    30         if(!N) break;
    31         nN = N * (N - 1) / 2;
    32         for(int i = 1; i <= nN; ++i) cin>>sum[i];
    33         for(int i = 3; i <= nN; ++i){
    34             //枚举出num[2]:
    35             //because sum[1] = num[1] + num[2];
    36             //sum[2] = num[1] + num[3]; num[2] + num[3] = sum[k]( 3 <= k <= nN)
    37             num[2] = (sum[1] - sum[2] + sum[i]) / 2;
    38             num[1] = sum[1] - num[2];
    39             num[3] = sum[2] - num[1];
    40             memset(visit, falsesizeof(visit));
    41             if(num[2] + num[3] == sum[i]){
    42                 visit[i] = true;
    43                 if( ok() ){     //检查是否符合条件,若符合,则输出
    44                     for(int j = 1; j < N; ++j) cout<<num[j]<<" ";
    45                     cout<<num[N]<<endl; break;
    46                 }
    47             }
    48         }
    49     }
    50     return 0;
    51 }
    View Code
  • 相关阅读:
    C/C++中的堆、栈和队列
    网卡工作状态检测
    Delphi 2007 的midas程序注册问题
    使用SQL语句备份与恢复数据库
    C/C++中的堆、栈和队列
    Delphi 2007 的midas程序注册问题
    如何使用VirtualBox的共享文件夹(转)
    如何使用VirtualBox的共享文件夹(转)
    C语言struct的使用
    printf常用格式
  • 原文地址:https://www.cnblogs.com/yaling/p/3233199.html
Copyright © 2011-2022 走看看