读书人

此论坛真热心以后可要多逛逛再发一

发布时间: 2012-03-31 13:13:26 作者: rapoo

此论坛真热心,以后可要多逛逛,再发一个问题!
问题:

要将五张100元的大钞票,换成等值的50元,20元,10元,5元一张的小钞票,要求换成30张小钞票,每种面值的至少一张,编程输出所有可能的换法,程序应适当考虑减少重复次数?

哎 对此类的问题真的没一个思路!望高人指点迷津!

[解决办法]
#include <stdio.h>
int cnt = 1;
FILE *fp;
int money(int *a, int *flag, int k, int worth, int *p, int m)
{
if(m==30&&k==4&&worth==0)
{
printf( "第%2d方案: ",cnt++);
fprintf(fp, "第%2d方案: ",cnt-1);
for(int i=0;i <4;i++)
{
printf( "%4d元的%4d张 ",a[i],p[i]);
fprintf(fp, "%4d元的%4d张 ",a[i],p[i]);
}
printf( "\n ");
fprintf(fp, "\r\n ");
return 0;
}
if(m> 30||k> 4||worth <0)return -1;

if(worth > = a[k])
{
if(flag[k]==1)
money(a,flag,k+1,worth,p,m);
p[k]++;
flag[k]=1;
money(a,flag,k,worth - a[k],p,m+1);
p[k]--;
flag[k]=0;
}
else
{
if(flag[k]==1)
money(a,flag,k+1,worth,p,m);
}
}

int main()
{
int a[]={50,20,10,5};
int p[5]={0};
int flag[5]={0};
fp = fopen( "1.txt ", "w ");
money(a,flag,0,500,p,0);
fclose(fp);
return 0;
}

读书人网 >C++

热点推荐