UVA 674 硬幣問題(完全揹包 列舉)

2021-08-28 21:12:26 字數 923 閱讀 2451

題意:給定金額n,有50,25,10,5,1這五種面值的錢,問共有多少種不同的找法(假設最少存在一種找法)。

這題我想了很久,都沒有找到合適的狀態轉移方程,最後看了別人寫的,又體會了半天,才算明白。

分析:這題,寫不對原因在於,很容易就重複計算了。例如 11 中的   (11111,5,111111)與(11111,111111,5)視為一種。

那麼怎麼避免重複計算呢。

首先從小的到大列舉面額(這個必須在外面迴圈)

比如 列舉 dp[0] = 1,dp[1] = 1,dp[2] = 1,d[3] = 1,dp[4] = 1

當列舉到dp[5]的 時候 第一遍 的結果是 dp[5] += dp[5-1] 此時 dp[5] = dp[4] = 1(實際上dp[5] = 2),下乙個迴圈列舉到

dp[5]的時候,dp[5] += dp[5-5] = 2。這樣單獨看某個值,最後都會遍歷到每乙個面值,也就是最終會滿足dp方程

這樣 第一遍 dp[6] += dp[6-1] =>dp[6] =  dp[5]  = 1, 第二遍 dp[6] += dp[6-5] =>dp[6] = 1 + dp[1] 不會重複。 

code:

#include#include#include#include#include#include#include#includeusing namespace std;

const int n = 10000;

int cost[10] = ;

int dp[n];

int main()

}while(scanf("%d",&n) != eof)

return 0;

}

uva674 完全揹包

題意 有5種硬幣1,5,10,25,50,現在隨意的給出乙個價錢,問你有幾種組合方式!輸入11 輸出41 1 10個 5 6 1 5 5 1,10 1 共4種 思路 滿足完全揹包思想,狀態轉移方程 dp i num k dp i dp i 為組合成i的不重複種數,num k 分別為1,5,10,25...

UVA 674 揹包之殤

題目位址 本來以為對於簡單的揹包已經了解了,可還是在這道題上掛了彩。自己寫了兩種 第一種是對每類錢,列舉其拿的張數 dp i j 累加dp i 1 j k money 我覺得8000 的資料,n3 也無所謂的,交上去t了。俗語雲 t乃a之母 起碼說明演算法是正確的,於是開始想優化的方法。想起來 前幾...

硬幣拼湊(01揹包和完全揹包)

有n1 n2種面值的硬幣,其中前n1種為普通幣,可以取任意枚,後n2種為紀念幣,每種最多只能取一枚,每種硬幣有乙個面值,問能用多少種方法拼出m的面值?輸入描述 第一行輸入三個整數n1,n2,m n1,n2 1000 m 100000 第二行輸入n1個整數表示普通幣的面值 第三行輸入n2個整數表示紀念...