硬幣找零
第 1 行,爲 N 和 T,其中 1≤N≤50 爲硬幣系統中不同硬幣數;1≤T≤100000 爲需要用硬幣找零的總數。
第 2 行爲 N 個數值不大於 65535 的正整數,它們是硬幣系統中各硬幣的面值。
當n,t同時爲0時結束。 輸出 輸出數據:
如 T 能被硬幣系統中的硬幣找零,請輸出最少的找零硬幣數。
如 T 不能被硬幣系統中的硬幣找零,請輸出剩下錢數最少的找零方案中的最少硬幣數。 樣例輸入
4 12 10 7 5 1樣例輸出
2
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define INF 0x3f3f3f3f //int型內無窮大
int dp[100001];
using namespace std;
int main()
{
int n,s,i,j;
int coins[51];
while(~scanf("%d%d",&n,&s))
{
if(n == 0&&s == 0) break;
for(i =0; i<n; i++)
scanf("%d",&coins[i]);
memset(dp,INF,sizeof(dp)); //因爲要找最小值,所以初始化爲無窮大
dp[0] = 0; //不要忘了初始化
for(i = 0; i<n; i++)
for(j = coins[i]; j<=s; j++)
{
dp[j] = min(dp[j],dp[j-coins[i]]+1);
}
for(i = s; i>=0; i--)
if(dp[i]<100001)
{
printf("%d\n",dp[i]);//找到最大能被換零的錢s
break;
}
}
return 0;
}