POJ 1564 Sum It Up
2013-06-22 14:30
225 查看
题目大意:给你N个数,加起来等于T的方式有多少种,不重复的输出出来。
思路:先用深搜搜出可选结果。然后再结果中找到那些已经选中的结果。具体筛选过程看注释
思路:先用深搜搜出可选结果。然后再结果中找到那些已经选中的结果。具体筛选过程看注释
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int tot,n; int a[1005]; int vis[1005]; int v[1005]; int t[1005]; int k; int flag; int dfs(int sum,int cur,int pos) { // printf("sum=%d cur=%d\n",sum,cur); if(sum==tot) { flag=1; for(k=0;k<cur-1;k++) printf("%d+",t[k]); printf("%d",t[k]); printf("\n"); return 1; } else if(sum>tot)return 0; for(int i=pos;i<n;i++) { if(vis[i]==1)continue; if(sum+a[i]<=tot) { vis[i]=1; t[cur]=a[i]; dfs(sum+a[i],cur+1,i); vis[i]=0; } while(i<n&&a[i]==a[i+1]) //此处为筛选,就是在搜索完成以后,那么这个数字的所有可能情况都被搜过了,就可以直接跳过了。 i++; } } int main() { while(scanf("%d%d",&tot,&n)!=EOF && tot && n) { flag=0; memset(vis,0,sizeof(vis)); memset(v,0,sizeof(v)); for(int i=0;i<n;i++) scanf("%d",&a[i]); printf("Sums of %d:\n",tot); dfs(0,0,0); if(!flag)printf("NONE\n"); } return 0; }
相关文章推荐
- POJ 1564 - Sum It Up
- POJ 1564 Sum It Up (DFS+剪枝)
- POJ_1564 Sum It Up(DFS)
- poj 1564 Sum It Up
- poj 1564 Sum It Up
- poj 1564 Sum It Up DFS
- 【DFS】poj 1564 Sum It Up(hdu 1258)
- POJ 1564 Sum It Up -dfs(回溯法)
- poj 1564 && zoj 1711 Sum It Up (dfs)
- ZOJ1711 POJ1564 Sum It Up,DFS+输出排序+去重复
- POJ 1564 Sum It Up (DFS+剪枝)
- zoj 1711 || poj 1564 Sum It Up(DFS~~~去重~)
- Sum It Up_poj1564_dfs+水
- POJ1564 ——Sum It Up
- poj 1564 Sum It Up
- POJ 1564 Sum It Up (DFS+剪枝)
- POJ 1564 Sum It Up(DFS)
- poj 1564 Sum It Up
- POJ 1564 Sum It Up(DFS)
- poj 1564 Sum It Up (DFS+ 去重+排序)