我们有面值1,元,3元,5元的硬币若干,如何用最少的硬币数凑出11元。
#include<stdio.h>
#include<string.h>int main()
{
void DP(int money[],int item,int num);
int item;
while(scanf("%d",&item)!=EOF)
{
int money[5];
int i,num;
for(i=0;i<item;i++)
scanf("%d",&money[i]);
scanf("%d",&num);
DP(money,item,num);
}
return 0;
}
void DP(int money[],int item,int num)
{
int dp[20];//,f[100]={0};
int i,j,k;
memset(dp,1,sizeof(dp));
dp[0]=0;
// for(i=1;i<20;i++)
// dp[i]=1;
for(i=0;i<=num;i++)
{
/* k=0;
for(j=0;j<item;j++)
{
if(i>=money[j])
{
f[k]=dp[i-money[j]]+1;
k++;
}
}
int min=f[0];
for(j=1;j<k;j++)
{
if(min>f[j])
min=f[j];
}
dp[i]=min;*/
for(j=0;j<item;j++)
{
if(i>=money[j] && dp[i]>dp[i-money[j]]+1)
dp[i]=dp[i-money[j]]+1;
}
}
printf("%d\n",dp[num]);
}
这个题用的是dp的思想,即:每一次都把数据进行更新,重置。