1 /*贪心可能导致无解; 2 硬币系统是10,7,5,1元,那么12元用贪心法得到的硬币数为3,而最少硬币数是2。 3 对于此题,可以举个例子: 4 若有1,5,7,10这四种货币,则易知 5 1=1 6 2=1+1 7 3=1+1+1 8 …… 9 6=5+1 10 那么推下去可知 11 表示12这个面值需要的货币数,等于表示11或7或5或2需要的货币数+1。 12 那么题中若要求表示12所需用的最小货币数,只需寻找表示11或7或5或2需要的货币数中的最小值。 13 14 */ 15 16 //硬币数无穷 17 #include <iostream> 18 #include <cstring> 19 using namespace std; 20 21 int coinValue[] = { 25, 21, 10, 5, 1 }; //硬币系统 22 int money = 63;//钱数 23 int coinUsed[100];//每种数量的钱币所需最少硬币数 24 25 void solve() 26 { 27 int i,j,k; 28 int len = sizeof(coinValue)/sizeof(coinValue[0]); 29 memset(coinUsed,0,sizeof(coinUsed)); 30 31 for(i=1; i<=money; i++)//递推 32 { 33 int minCoins = i/coinValue[len-1]; 34 int temp = 0; 35 for(j=0; j<len; j++) 36 { 37 if(i>=coinValue[j]) 38 { 39 temp = coinUsed[i - coinValue[j]] + 1; 40 /* 41 在temp赋初值为0时,下面的if不能和外层if并列,改为1貌似对了 42 money=1时前几次 内层for未执行,此时 minCoins变为0了,到内层最后temp变为1,不过此时 minCoins还是0,所以就错了 43 */ 44 if(minCoins>temp) 45 minCoins = temp; 46 } 47 48 } 49 coinUsed[i] = minCoins; 50 } 51 } 52 53 int main() 54 { 55 int i,j,k; 56 solve(); 57 cout<<coinUsed[money]<<endl; 58 while(1); 59 return 0; 60 }
时间: 2024-09-28 22:31:14