【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108476
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

描述 Description
  每年的12月24日,是圣诞老人忙碌的日子,也只有这一天,他才会忙碌起来。面对着将要来临的宁静的夜晚,是一种怎样的幸福和安宁感。作为圣诞老人的第一件事,就是需要为世界各地的孩子们写上贺卡,带上自己的祝福和礼品送给他们。毕竟,世界上那么多可爱的孩子,要给他们每一个人写一封贺卡,单凭自己的力量是不足以完成的。
  众所周知,一直陪伴在圣诞老人身边的是快乐的小精灵们。他们为圣诞老人而工作,其实是一个很乐意的事情。冰天雪地的北极,是他们的家,是圣诞老人的家。圣诞老人一直以来对于贺卡的书写非常重视,他也一直请一些优秀的小精灵们去帮助他完成这件事……
  12月24日早上7点钟。北极圣诞区开了一个会,会议由圣诞老人主持,在会的其他都是小精灵们,他们似乎都非常高兴,原因是等待圣诞老人的一份名单。这份名单里面的人都是这些小精灵们,一共n有个小精灵。这n个小精灵是圣诞老人根据这一年大家的表现状况(比如说谁吃饭吃得最多、谁调制的巧克力最好吃、谁的笑声最大、谁最不喜欢哭等等因素)而制定的预选的书写贺卡者名单。
  圣诞老人一个一个字,饱含激情地念出了每一个预选的小精灵。鼓掌……
  可是,接下来。并不是这个预选名单里面的所有小精灵都可以参加贺卡书写这个合作性任务。因为在以前的贺卡书写合作任务中,有一些小精灵们因为某些原因而对书写的格式和书写的字体喋喋不休。所以尽量避免这种情况发生,圣诞老人必须从预选名单中选出m(1<=m<=n)个小精灵来完成这项任务。可是……每一个小精灵的贺卡书写质量又有所不同……
 圣诞老人想了想,他觉得应该在其中选择m个小精灵,使得这m个小精灵中任意两个在曾经的贺卡书写合作任务中没有发生过矛盾冲突,并且需要这m个小精灵的书写质量的总合S最高。

输入格式 Input Format
第一行一个数n。
第二行n个数,第i个数代表预选名单中第i号小精灵的书写质量(均为非负整数)。
接下来有若干行,每行两个不同的非负整数x和y,表示预选名单中第x号和第y号的小精灵曾经在贺卡书写合作任务中发生过冲突。

输出格式 Output Format
第一行一个数S。

样例输入 Sample Input
3
4 2 5
1 2

样例输出 Sample Output
9

时间限制 Time Limitation
各个测试点1s

注释 Hint
1<=n<=50,1<=x,y<=n
友情提示:可能没有矛盾关系,使用SEEKEOF和EOF都有出错的可能,请加条件判断。


分析:
DFS搜索题,但是需要加上一些优化(剪枝).
优化:
(1):先按从大到小对数据排序,利于搜索时从大搜到小,保证不会有后面的还优于现在的。
(2):对于每次搜索,如果当前的s+剩下的最优可以选的m<=当前搜索到的最优值,则剪枝。

【参考程序】:

#include<cstring>
#include
<cstdio>
#include
<cstdlib>
#include
<iostream>
using namespace std;

int b[60][60],c[60],v[60];
int n,ans;
void dfs(int k,int s)
{
    
int m;
    
if (s>ans) ans=s;
    
for (int i=k;i<=n;i++)
        
if (c[i]==0)
        {
            m
=0;
            
for (int j=1;j<=b[i][0];j++) c[b[i][j]]++;
            
for (int j=i+1;j<=n;j++)
                
if (c[j]==0) m+=v[j];
            
if (m+s+v[i]<=ans)
            {
                
for (int j=1;j<=b[i][0];j++) c[b[i][j]]--;
                
continue;
            }
            c[i]
=1;
            dfs(i
+1,s+v[i]);
            
for (int j=1;j<=b[i][0];j++) c[b[i][j]]--;
            c[i]
=0;
        }
}
int main()
{
    
//freopen("data.in","r",stdin);
    
//freopen("data.out","w",stdout);
    scanf("%d",&n);
    
for (int i=1;i<=n;i++) scanf("%d",&v[i]);
    
int x,y;
    memset(b,
0,sizeof(b));
    
while (scanf("%d%d",&x,&y)!=EOF)
    {
        b[x][
0]++; b[x][b[x][0]]=y;
        b[y][
0]++; b[y][b[y][0]]=x;
    }
    memset(c,
0,sizeof(c));
    ans
=0;
    dfs(
1,0);
    printf(
"%d\n",ans);
    
return 0;
}
posted on 2009-10-03 16:38 开拓者 阅读(196) 评论(0)  编辑 收藏 引用 所属分类: 算法&例题Vijos OJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理