主题:邮票问题的一个解法
fygood
[专家分:0] 发布于 2002-12-11 16:27:00
设一国家发行n种不同面值的邮票,并且每封信至多允许贴m张邮票,对于给定的m,n值,写一个算法求出从邮资1开始在增量为一的情况下可能获得的邮资值的最大连续区域以及获得这个区域的各种可能面值的集合。如,当 n=4,m=5,若有面值为(1,4,12,21)的四种邮票,则邮资最大的连续区域为1到71。还有其他面值的四种邮票可组成同样大小的区域吗??#define M 5
#define N 4
int Sum[200];
int T=1;
int J;
int cc[N];
int sign=1;
int A[M+1]={1},A1[M+1]={1};
check(int count)
{int s,i;
work(count);
for(i=1;;i++)
for(s=0;s<J;s++)
{
if(Sum[s]==i)
break;
if(s==J-1)
return i-1;
}
}
work(int count)
{int i;
int su=0;
if(sign==0)
{for(i=0;i<T;i++)
su+=A[cc[i]];
for(i=0;i<J;i++)
if(Sum[i]==su)
break;
if(i==J)
{Sum[J]=su;
J++;
}
return -1;
}
for(T=1;T<=N;T++)
dod(0,1,count);
}
dod(int j1,int i,int count)
{
if(i==T+1)
{sign=0;
work(count);
return 0;
}
for(j1=0;j1<M;j1++)
{cc[i-1]=j1;
dod(j1,i+1,count);
}
}
we(int count)
{int i,m,k;
J=0;
sign=1;
if(count==M)
{A[M]=check(count);
if(A[M]>A1[M])
for(i=0;i<M+1;i++)
A1[i]=A[i];
return 0;
}
k=check(count);
for(m=A[count-1]+1;m<k+2;m++)
{
A[count]=m;
we(count+1);
}
}
main()
{int i;
we(1);
for(i=0;i<M+1;i++)
printf("\t%d",A1[i]);
}
回复列表 (共10个回复)
沙发
addict [专家分:0] 发布于 2002-12-14 17:49:00
运行时怎么有错啊
着急啊
看不明白
这位大侠给点
给一点注释吧
我要交这个作业
谢谢了
板凳
fygood [专家分:0] 发布于 2002-12-16 18:24:00
不会吧!我在机上试好了拷过去的,它出现什么错误?你是用turboc吗?
3 楼
fygood1 [专家分:0] 发布于 2002-12-18 16:08:00
??????
4 楼
xygg1111 [专家分:0] 发布于 2003-05-17 16:17:00
这个程序在tc中怎么可能不加修改就通过呢?明显有问题呀!!!
5 楼
飞鹰虎 [专家分:80] 发布于 2003-05-21 08:09:00
你能不解释一下这个题???????
6 楼
publicClass [专家分:510] 发布于 2005-04-04 21:55:00
真遗憾,我编译它也出现了好多错误提示,实在可惜。哪位高人能给个C++编译成功的整理稿吗?
7 楼
molotov [专家分:0] 发布于 2005-11-15 16:45:00
!!!
8 楼
hellson [专家分:1820] 发布于 2005-11-15 17:34:00
#include <stdio.h>
#define M 5
#define N 4
int Sum[200];
int T=1;
int J;
int cc[N];
int sign=1;
int A[M+1]={1},A1[M+1]={1};
int work(int);
int dod(int,int,int);
int check(int count)
{int s,i;
work(count);
for(i=1;;i++)
for(s=0;s<J;s++)
{
if(Sum[s]==i)
break;
if(s==J-1)
return i-1;
}
}
int work(int count)
{int i;
int su=0;
if(sign==0)
{for(i=0;i<T;i++)
su+=A[cc[i]];
for(i=0;i<J;i++)
if(Sum[i]==su)
break;
if(i==J)
{Sum[J]=su;
J++;
}
return -1;
}
for(T=1;T<=N;T++)
dod(0,1,count);
return(1);
}
int dod(int j1,int i,int count)
{
if(i==T+1)
{sign=0;
work(count);
return 0;
}
for(j1=0;j1<M;j1++)
{cc[i-1]=j1;
dod(j1,i+1,count);
}
return(1);
}
int we(int count)
{int i,m,k;
J=0;
sign=1;
if(count==M)
{A[M]=check(count);
if(A[M]>A1[M])
for(i=0;i<M+1;i++)
A1[i]=A[i];
return 0;
}
k=check(count);
for(m=A[count-1]+1;m<k+2;m++)
{
A[count]=m;
we(count+1);
}
return(1);
}
void main()
{int i;
we(1);
for(i=0;i<M+1;i++)
printf("\t%d",A1[i]);
}
9 楼
301boy [专家分:220] 发布于 2005-11-26 15:25:00
#include"stdio.h"
void main()
{
int m,n,i,j,k=1,l,f=0,sum=0,num,count=0;
int a[100];
printf("m n");
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
for(j=1;;j++)
{
for(i=k-1;i<m;i++)
{
if(j<=a[i])
{
k=i;
break;
}
}
num=j;
for(l=k;l>=0;l--)
{
count=num/a[l]+count;
sum=num/a[l]*a[l]+sum;
num=num%a[l];
if(count>n)
{
f=1;
printf("the last is %d",j-1);
break;
}
if(sum==j)
{
break;
}
}
count=0;
sum=0;
if(f==1)
break;
}
}
10 楼
zzdragonzz [专家分:0] 发布于 2006-01-26 14:47:00
[em1]
#include "stdio.h"
long kr[505],r=0,t=0;
int stamp[21],mm[21],m,n,gg[20]={0};
void lanjie(int p,int q,long b)
{
if(p==0)
{
if (b<505) kr[b]=b; /*将数放到对应下标的数组元素*/
}
else
for(gg[p-1]=0;gg[p-1]<=q;gg[p-1]++) /*乘系数*/
lanjie(p-1,q-gg[p-1],b+gg[p-1]*mm[p-1]);
}
void zz(int k)
{
long i;
if(k==0) /*取好一种方案*/
{
t=0;
for (i=0;i<=500;i++) kr[i]=0;
lanjie(m,n,0);
for (i=1;kr[i]!=0;i++);
t=i-1; /*算出此方案的t*/
if(t>r) /*t与r比较*/
{
for(i=0;i<m;i++)
stamp[i]=mm[i];
r=t;
}
}
else
{
for(mm[k-1]=mm[k]+1;mm[k-1]<=2*m*n+1;mm[k-1]++)/*取方案*/
zz(k-1);
}
}
void main()
{
int i;
printf("input m (NUM of types) and n (NUM of pieces):");
scanf("%d%d",&m,&n);
for(i=0;i<21;i++)
mm[i]=1; /*赋初值*/
mm[m]=0;
zz(m);
for(i=0;i<m;i++)
printf("%d ,",stamp[i]); /*输出*/
printf("\n\n%d\n",r);
}
我来回复