·August· 2011-10-23 08:58:00
点我顶贴
收藏
删除
int n,k;//k种共n张
int a[21];//记录面值
int b[2010];//记录每种邮资是否能,需几张
int aa[21];//最优方案
int Max;//最大面值
void dp()
{
memset(b,0,sizeof(b));
int i,j;
for(i=1;i<=k;i++) b[a[i]]=1;
for(i=1;i<=k;i++)
for(j=1;j<=1000;j++)
{
if(j>a[i])
if(b[j-a[i]]!=0 && b[j-a[i]]<n)//有该面值为k的方案
if((b[j]!=0 && b[j]>b[j-a[i]]+1)||(b[j]==0))//且优于原方案或无原方案
{ b[j]=b[j-a[i]]+1;}
}
for(i=1;i<1000;i++)
if(b[i]==0)
{
if(Max<i)
{
Max=i-1;
for(j=1;j<=k;j++)
aa[j]=a[j];
}
break;
}
}