#include <stdio.h>
int num,max;
void CoinRow(int c[],int f[],int n)// 回溯
{int i;
if(n>num)
{
if(f[num]>f[num-1])
printf("%d",f[num]);
else printf("%d",f[num-1]);
printf("\n");
return ;
}
else {
if(c[n]+f[n-2]>f[n-1])
{
f[n]=c[n]+f[n-2];
CoinRow(c,f,n+1);
}
else {
f[n]=f[n-1];
CoinRow(c,f,n+1);
}
}
}
/*int CoinRow(int c[],int f[]) //动态规划
{
int i;
for(i=2;i<=num;i++)
{
f[i]=(c[i]+f[i-2])>f[i-1]?(c[i]+f[i-2]):f[i-1];
}
for(i=0;i<=num;i++)
printf("%d ",f[i]);
printf("\n");
max=f[num]>f[num-1]?f[num]:f[num-1];
return max;
}*/
int main()
{
printf("请输入硬币的数量");
int i,n=0;
scanf("%d",&num);
int c[num+1],f[num+1],x[num];
printf("请输入个硬币的面值: ");
for(i=1;i<=num;i++)
scanf("%d",&c[i]);
f[0]=0;
f[1]=c[1];
CoinRow(c,f,1);
for(i=num;i>0;i--)
{
if(f[i]!=f[i-1])
{
x[n]=c[i];
i--;
n++;
}
else{i--;
x[n]=c[i];
n++;
}
}
printf("被选中的面额分别为:");
for(i=n-1;i>=0;i--)
printf("%d ",x[i]);
printf("\n");
return 0;
}
币值最大化——动态规划,回溯
最新推荐文章于 2023-10-26 08:27:48 发布