您的位置:首页 > 其它

zoj 1711 Sum It Up

2010-04-30 16:36 393 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1711

一道DFS的题目.和zoj 1204很相像.因为先做过1204了.所以想都没想就以为差不多.结果囧了..搞了很久才发现题目意思不一样.

本题的难点是消除重复.我用了一个笨方法.将求出来的答案放到一个vector里,再将这个vector放到set里面.因为set会去重.所以就OK了.网

上有更好的方法.只是看不懂.-_-||

上代码哈哈~~

/*
* 1711.cpp
*
*  Created on: Apr 30, 2010
*      Author: wyy
*
*/
#define MaxNum 12
#include<cstdio>
#include<set>
#include<vector>
using namespace std;

bool flag;
int T, N;
int num[MaxNum];
int ret[MaxNum];
set< vector<int> > S;

void Init()
{
flag = false;
S.clear();
for(int i = 0; i < N; ++i)
scanf("%d", &num[i]);
printf("Sums of %d:/n", T);
}

void DFS(int size, int pos, int sum)
{
if(sum == T)
{
vector<int> ivec;
for(int i = 0; i < size; ++i)
ivec.push_back(ret[i]);
int t = S.size();
S.insert(ivec);
if(t < S.size())
{
for(int i = 0; i < size - 1; ++i)
printf("%d+", ret[i]);
printf("%d/n", ret[size - 1]);
flag = true;
}
}
else if(sum < T)
{
for(int i = pos; i < N; ++i)
{
if(sum + num[i] <= T)
{
ret[size] = num[i];
DFS(size + 1, i + 1, sum + ret[size]);
}
}
}
}

int main()
{
//freopen("input.txt", "r", stdin);
while(scanf("%d%d", &T, &N) && T && N)
{
Init();
DFS(0, 0, 0);
if(!flag)
printf("NONE/n");
}
//fclose(stdin);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: