POJ 1564 Sum It Up -dfs(回溯法)
2015-09-08 17:12
405 查看
题意:给定一个数字t和一个长度为n的数列,求选择数列中的一些数字使之加起来的和是t,按照字典序递减的顺序输出每种选择。
分析:
就是一个暴力枚举,用回溯法(借助dfs)。
因为要求以字典序递减顺序输出,又因为已知输入的数列是按非增输入的,所以枚举的时候直接先选前面的数就行了。
另一个要处理的就是去重。因为输入的数列中可能有重复的数,所以可能会生成重复的一种解,用vector数组保存所有的解,然后二重循环比较去重即可。
代码:
分析:
就是一个暴力枚举,用回溯法(借助dfs)。
因为要求以字典序递减顺序输出,又因为已知输入的数列是按非增输入的,所以枚举的时候直接先选前面的数就行了。
另一个要处理的就是去重。因为输入的数列中可能有重复的数,所以可能会生成重复的一种解,用vector数组保存所有的解,然后二重循环比较去重即可。
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; int t,n; int a[20]; int vis[1000]; vector<int> ans[1000],b; vector<int>::iterator it; vector<int>::iterator it2; int cnt,tot; void prin(int i) { for(it=ans[i].begin();it!=ans[i].end();it++){ if(it!=ans[i].begin()) printf("+"); printf("%d",(*it)); } printf("\n"); } void cp() { for(it=b.begin();it!=b.end();it++){ ans[tot].push_back((*it)); } tot++; } void dfs(int cur,int y) { if(cur==t){ cp(); return; } for(int i=y+1;i<n;i++){ if(cur+a[i]<=t){ int tmp=a[i]; b.push_back(tmp); dfs(cur+a[i],i); it=b.end(); it--; b.erase(it); } } } int main() { while(scanf("%d%d",&t,&n)!=EOF){ if(!n) break; for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<500;i++) ans[i].clear(); printf("Sums of %d:\n",t); tot=0; for(int i=0;i<n;i++){ b.clear(); b.push_back(a[i]); dfs(a[i],i); } memset(vis,0,sizeof(vis)); for(int i=0;i<tot;i++){ for(int j=i+1;j<tot;j++){ int ok2=0; for(it=ans[i].begin(),it2=ans[j].begin();it!=ans[i].end()&&it2!=ans[j].end();it++,it2++){ if((*it)!=(*it2)){ ok2=1;break; } } if(ok2==0||(it==ans[i].end()&&it2!=ans[j].end()||it!=ans[i].end()&&it2==ans[j].end())) vis[i]=1; } } if(tot==0) printf("NONE\n"); else{ for(int i=0;i<tot;i++){ if(!vis[i]){ prin(i); } } } } }
相关文章推荐
- Recover Binary Search Tree
- x += i与x=x+i
- LeetCode之Reverse Words in a String
- 用Redis实现Session功能
- ios技术博客
- leetcode--Find Minimum in Rotated Sorted Array --C++
- WebService服务端与客户端开发
- 5个好用的混合式App开发工具
- BeanFactory接口包含基本方法
- matlab map
- 彩票摇奖
- 单例模式的思想简介
- xen虚拟机利用dom0内核来创建(二)
- 【springmvc+mybatis项目实战】杰信商贸-8.生产厂家修改
- GitHub 优秀的 Android 开源项目
- QPBOC联机查询:后台响应 作弊卡 问题分析和解决方法
- 同类型对象利用反射自动赋值
- 计算机语言基础知识
- 数据库中索引原理(超经典)(附链接)
- Java 执行linux命令(转)