hdoj 1258 Sum It Up (递归回溯)
2011-02-19 23:59
309 查看
题目大意:给定由n(1<=n<=12)个数组成的非升序序列,求其中的任意组合使和等于给定的数.要求输出的结果不能重复,每个结果按非升序,且各个结果间按原序列的字典序.
思路:深搜递归回溯.
按序列的非升序去重复.
#include <iostream>
using namespace std;
int num[13],t[13];
int n,m,tot,len,flag;
void find(int start,int sum)
{
int i;
if(sum==tot){
flag=1;
for(i=0;i<len-1;i++)
printf("%d+",t[i]);
printf("%d\n",t[i]);
return ;
}
int tmp;
for(i=start;i<n;i++){
tmp=sum+num[i];
if(tmp>tot)
continue;
if(i>start && num[i]==num[i-1])
continue;
t[len++]=num[i];
find(i+1,tmp);
len--;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&tot,&n)!=EOF ,n,tot)
{
for(i=0;i<n;i++)
scanf("%d",&num[i]);
flag=0;
len=0;
printf("Sums of %d:\n",tot);
find(0,0);
if(!flag){
printf("NONE\n");
continue;
}
}
return 0;
}
思路:深搜递归回溯.
按序列的非升序去重复.
#include <iostream>
using namespace std;
int num[13],t[13];
int n,m,tot,len,flag;
void find(int start,int sum)
{
int i;
if(sum==tot){
flag=1;
for(i=0;i<len-1;i++)
printf("%d+",t[i]);
printf("%d\n",t[i]);
return ;
}
int tmp;
for(i=start;i<n;i++){
tmp=sum+num[i];
if(tmp>tot)
continue;
if(i>start && num[i]==num[i-1])
continue;
t[len++]=num[i];
find(i+1,tmp);
len--;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&tot,&n)!=EOF ,n,tot)
{
for(i=0;i<n;i++)
scanf("%d",&num[i]);
flag=0;
len=0;
printf("Sums of %d:\n",tot);
find(0,0);
if(!flag){
printf("NONE\n");
continue;
}
}
return 0;
}
相关文章推荐
- hdoj 1258 Sum It Up【DFS】
- HDOJ 1258 Sum It Up(DFS)
- hdoj--1258--Sum It Up(dfs)
- hdoj 1258 SUM IT UP
- hdoj--1258--Sum It Up(dfs)
- hdoj-1258 Sum It Up
- hdoj 1258 SUM IT UP
- hdoj 1258 Sum It Up(DFS)
- HDU 1258 Sum it up 回溯法 暴力
- HDOJ 题目1258 Sum It Up(DFS)
- hdoj - 1258 Sum It Up && hdoj - 1016 Prime Ring Problem (简单dfs)
- Hdoj 1258 Sum it up
- 【HDOJ】1258 Sum It Up
- HDOJ(HDU).1258 Sum It Up (DFS)
- HDU 1258 Sum It Up (dfs+去重)
- hdu 1258 Sum It Up
- hdu 1258 Sum It Up 搜索
- HDU 1258 Sum It Up
- HDU 1258 Sum It Up 深搜
- HDU 1258 Sum It Up(DFS)