HDU 1284 錢幣兌換問題【dp】

HDU 1284 錢幣兌換問題

思路:此題是基礎的完全揹包問題。只有3個硬幣,範圍是32768,可以一個一個枚舉硬幣,如果只放價值爲1的硬幣,從d[1]遞推到d[n];如果再加上價值爲2的硬幣,那麼就從d[2]遞推到d[n];在加上價值爲3的硬幣,就從d[3]遞推到d[n].遞推公式是d[j] = d[j] + d[  j-w[i]  ]; d[j]表示j有幾種只用1,2, 3這三個數字的拆分方法,  w[i]   就是硬幣的價值。

 

可以先打好表,然後直接求解 

注意:和樓梯問題有區別,樓梯先上2階再上1階與先上1階再上2階,是兩種。錢分爲1分+2分,是一種.

#include<iostream>   
#include<string.h>  
using namespace std;  
  
int dp[33000];  
int w[3]={1,2,3};  
  
void f()  
{  
    int i,j;  
    memset(dp,0,sizeof(dp));  
    dp[0] = 1;  
    for(i = 0; i < 3; i++) //i=0,只用1分硬幣;i=1,只用1分和2分硬幣;i=2,用1.2.3分硬幣; 
        for(j = w[i]; j <= 33000; j++)  
        {  
            dp[j] = dp[j]+dp[j-w[i]];  
        }   
}  
  
int main()  
{  
    int N;  
    f();  
    while(cin>>N)  
    {  
        cout<<dp[N]<<endl;  
    }  
    return 0;  
} 

i=0

w[i]=1

j=1 dp[1]=dp[1]+dp[1-1]=1                                     1
j=2 dp[2]=dp[2]+dp[2-1]=1 11
j=3 dp[3]=dp[3]+dp[3-1]=1 111
j=4 dp[4]=dp[4]+dp[4-1]=1 1111
j=5 dp[5]=dp[5]+dp[5-1]=1 11111
j=6 dp[6]=dp[6]+dp[6-1]=1 111111

 

i=1

w[i]=2

j=2 dp[2]=dp[2]+dp[2-2]=2 11,2
j=3 dp[3]=dp[3]+dp[3-2]=2 111,12
j=4 dp[4]=dp[4]+dp[4-2]=3 1111,112,22
j=5 dp[5]=dp[5]+dp[5-2]=3 11111,1112,122
j=6 dp[6]=dp[6]+dp[6-2]=4 111111,11112,1122,222
     

 

i=2

w[i]=3

j=3 dp[3]=dp[3]+dp[3-3]=3 111,12,3
j=4 dp[4]=dp[4]+dp[4-3]=4 1111,112,22,13
j=5 dp[5]=dp[5]+dp[5-3]=5 11111,1112,122,113,23
j=6 dp[6]=dp[6]+dp[6-3]=7 111111,11112,1122,222,1113,123,33
     
     

 

發佈了95 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章