一开始不懂,参考了D_Double的博客才懂~~
要先挑出k个面值,再找h张邮票的面值的最大连续取值!
#include<stdio.h>
#include<string.h>
int denomination[10];
bool marksum[100000];
int h,k;
int maxsum;
void sum(int* temp,int num,int nsum,int tl) //has chosen num tickets,summing 'sum' amount
{
if(num == h)
{
return;
}
for(int i=0;i < tl;i++)
{
marksum[nsum+temp[i]]=true;
sum(temp,num+1,nsum+temp[i],tl);
}
}
int returnmax(int* temp,int num,int nsum,int tl)
{
memset(marksum,false,sizeof(marksum));
sum(temp,num,nsum,tl);
int max;
for(max=1; marksum[max];++max)
continue;
max--;
return max;
}
void deno(int* temp,int cur)
{
if(cur==k)
{
int max= returnmax(temp,0,0,k);
if(max > maxsum)
{
maxsum = max;
memcpy(denomination,temp,sizeof(denomination));
}
return;
}
for(int i=temp[cur-1]+1;i<=returnmax(temp,0,0,cur)+1;++i)
{
temp[cur]=i;
deno(temp,cur+1);
}
}
int main()
{
//
freopen("input.txt","r",stdin);
freopen("out.txt","w",stdout);
while(scanf("%d%d",&h,&k)==2)
{
if(!h&&!k) break;
int temp[10];
memset(temp,0,sizeof(temp));
temp[0]=1;
//marksum[1]=true;
maxsum=0;
deno(temp,1);
for(int i=0;i < k;i++)
{
printf("%3d",denomination[i]);
}
printf(" ->%3d\n",maxsum);
}
}