然后又再优化了代码~发现原代码有些地方还可以完善~再次发个完整版代码
~
程序代码:
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#include<string.h>
int Comp(const void* p1,const void* p2);
void Input(size_t** a,size_t** k,size_t* n,size_t* m);
void Fun(size_t a[],size_t k[],size_t n,size_t m);
void Output(size_t a[],size_t k[],size_t m);
int main( void )
{
size_t* a=NULL;
size_t* k=NULL;
size_t n=0;
size_t m=0;
Input(&a,&k,&n,&m);
Fun(a,k,n,m);
Output(a,k,m);
free(a);
free(k);
return 0;
}
int Comp(const void* p1,const void* p2)
{
if (*(size_t*)p1>*(size_t*)p2)
return 1;
else if (*(size_t*)p1<*(size_t*)p2)
return -1;
return 0;
}
void Input(size_t** a,size_t** k,size_t* n,size_t* m)
{
size_t i;
puts("请输入元素个数和所求定值和:");
if (scanf("%u%u",(unsigned* )n,(unsigned* )m)!=2)
exit(0);
++*m;
*a=malloc(*n*sizeof(**a));
if (*a==NULL)
exit(0);
memset(*a,0,*n*sizeof(**a));
*k=malloc(*m*sizeof(**k));
if (*k==NULL)
exit(0);
memset(*k,-1,*m*sizeof(**k));
printf("请输入%u个元素:\n",*(unsigned* )n);
for (i=0;i!=*n;++i)
if (scanf("%u",(unsigned* )&((*a)[i]))!=1)
exit(0);
}
void Fun(size_t a[],size_t k[],size_t n,size_t m)
{
size_t i=0;
size_t j=0;
size_t next=0;
size_t rear=n-1;
size_t MinWeight=0;
qsort(a,n,sizeof(*a),Comp);
for (i=n-1;i!=-1&&a[i]>m;--i);
for (;i!=-1;--i)
k[a[i]]=i;
for (i=a[0];;++i)
{
while (i+a[rear]>m)
{
for (;next!=rear&&i>MinWeight+a[next];MinWeight+=a[next++]);
if (rear--<=next)
return ;
}
for (j=rear;j>k[i];--j)
k[i+a[j]]=j;
}
}
void Output(size_t a[],size_t k[],size_t m)
{
size_t i=0;
size_t j=0;
for (;i!=m;++i)
if (k[i]!=-1)
{
printf("%u=%u",(unsigned)i,(unsigned)a[k[i]]);
for (j=i;j-=a[k[j]];)
printf("+%u",(unsigned)a[k[j]]);
puts("");
}
}
PS:测试代码
~
程序代码:
void Fun(size_t a[],size_t k[],size_t n,size_t m)
{
size_t i=0;
size_t j=0;
size_t next=0;
size_t rear=n-1;
size_t MinWeight=0;
qsort(a,n,sizeof(*a),Comp);
for (i=n-1;i!=-1&&a[i]>m;--i);
for (;i!=-1;--i)
k[a[i]]=i;
for (;next!=rear&&MinWeight+a[next]<=m;MinWeight+=a[next++]);
if (!next)
return ;
for (i=a[0];;++i)
{
while (i+a[rear]>m)
if (rear--<next)
return ;
for (j=rear;j>k[i];--j)
k[i+a[j]]=j;
}
}
[此贴子已经被作者于2017-12-20 17:03编辑过]