您的位置:首页 > 其它

uva 574 Sum It Up

2016-04-09 20:37 197 查看
这一道题 ,我本以为按常规方法做,以为只要比较前一组输出就行,可后来调试发现,输出竟然与上上一组重复,所以我重新写了好思路形成的代码。

代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define TEST
using namespace std;

int sum1[13],sum2[13],sum3[13],sum4[13];
int n,t,d,flag;
void print_num();
void backtracking(int m);
bool cmp(int a,int b)
{
return a > b;
}

void print_num(int m)
{

int index = 1,f;
flag = 0;
for(int i = 0; i <= d; i++)
{
if(sum4[i] != 0)
{
f =sum4[i];

while(f--){
if(index) {printf("%d",sum2[i]); index = 0;}
else printf("+%d",sum2[i]);
}

}

}sum4[m] = 0;
printf("\n");
}
void backtracking(int m)
{
int f;
if(t <= 0)
{
if(t == 0)
print_num(m);
return ;
}
else if(m <=d)
{

f = sum3[m];
f++;
do
{

f --;

sum4[m] = f;
t -=sum2[m]*f;
backtracking(m+1);
t +=sum2[m]*f;
sum4[m] = 0;

}while(f);

}
return ;
}
int main()
{
#ifdef TEST
freopen("in.txt","r",stdin);
freopen("out.text","w",stdout);
#endif // TEST
int i;
while(~scanf("%d",&t))
{
d = 0;
scanf("%d",&n);
if(n == 0) break;
for(i= 0;i < n;i ++)
scanf("%d",&sum1[i]);
sort(sum1,sum1+n,cmp);
memset(sum2,0,sizeof(sum2));
memset(sum3,0,sizeof(sum3));// 注意不能memset 1;
memset(sum4,0,sizeof(sum4));
sum2[0] = sum1[0];
sum3[0] ++;
for(i = 1; i < n; i ++)
{
if(sum1[i-1] == sum1[i])
{
sum3[d] ++;
}
else{
sum2[++d] = sum1[i];
sum3[d] ++;
}
}

flag = 1;
printf("Sums of %d:\n",t);
backtracking(0);
if(flag) printf("NONE\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: