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 | |