Codeup 貨幣系統(完全揹包問題)

Just Go For It Now發表於2018-09-09

21869: 貨幣系統

題目描述

母牛們不但建立了他們自己的政府而且選擇了建立了自己的貨幣系統。
[In their own rebellious way],,他們對貨幣的數值感到好奇。
傳統地,一個貨幣系統是由1,5,10,20 或 25,50, 和 100的單位面值組成的。
母牛想知道有多少種不同的方法來用貨幣系統中的貨幣來構造一個確定的數值。
舉例來說, 使用一個貨幣系統 {1,2,5,10,...}產生 18單位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它。
寫一個程式來計算有多少種方法用給定的貨幣系統來構造一定數量的面值。
保證總數將會適合long long (C/C++) 和 Int64 (Free Pascal)。

輸入

輸入包含多組測試資料

 

貨幣系統中貨幣的種類數目是 V 。 (1<= V<=25)
要構造的數量錢是 N 。 (1<= N<=10,000)

第 1 行:  二整數, V 和 N
第 2 ..V+1行: 可用的貨幣 V 個整數 (每行一個 每行沒有其它的數)。

 

輸出

單獨的一行包含那個可能的構造的方案數。

樣例輸入

3 10
1 2 5

樣例輸出

10

 上述問題是一個典型的完全揹包問題,注意:

  • 輸出的答案可能會超出int的範圍,因此要設成long long的形式。
  • 狀態轉移方程不再是簡單的取大取小了
#include <stdio.h>
int money[28];
long long dp[10005];

#define INF 0x3fffffff

int min(int a,int b)
{
    return (a<b)?a:b;
}

int main()
{
    int V,N;
    while(scanf("%d %d",&V,&N)!=EOF)
    {
        int i,j;
        for(i=1;i<=V;i++) scanf("%d",&money[i]);
        for(i=0;i<=N;i++) dp[i]=0;
        dp[0]=1;
        for(i=1;i<=V;i++)
        {
            for(j=money[i];j<=N;j++)
            {
                dp[j]=dp[j]+dp[j-money[i]];
            }
        }
        printf("%lld\n",dp[N]);
    }
    return 0;
}

 

相關文章