Coins (POJ 1742)(多重揹包QAQ)

2021-09-25 03:40:42 字數 1717 閱讀 2915

coins (poj 1742)

time limit: 3000ms memory limit: 30000k

題意:n種貨幣,每種貨幣兩個屬性:a[ i ] (價值),c[ i ] (數量);商品價值上限m。問有多少種**的商品可以不找零買到。

題解:這是乙個多重揹包的問題,可能會想到用二進位制優化,但是算一下時間複雜度是過大了的,實際也會t。所以我們用另外一種方式來做:

dp[ i ]用來表示 i 價值的商品是否可以不找零買到,可以->1,不可以->0

num[ i ]用來表示 i 價值的商品要用到幾個當前的這種coin(為了保證用的coin數量不超過上限)

a[1] :               a[2] :       

4(1) 6(1)

8(2) 10(1)

12(3) 12(0)

16(4) 14(1)

20(5) 18(1)

24(6) 22(1)

28(7) 24(0)

可以發現:

dp[ j ]=0->    num[ j ]=num[ j-a[ i ] ]+1

dp[ j ]=1-> num[ j ]=num[ j ]

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define p(x) x>0?x:0

#define inf 0x3f3f3f3f

using namespace std;

typedef

long

long ll;

typedef vector<

int>

:: iterator viter;

const

int maxn=

105;

const

int maxc=

1e5+5;

int a[maxn]

;int c[maxn]

;int dp[maxc]

;//dp[i]是i價值的狀態是否存在,存在為1,不存在為0

int num[maxc]

;//num[i]:該種coin可以組成的價值i,用掉了幾個這種coin

int n,m,ans;

//n是coins的種類,m是價值的上限

void

init()

intmain()

}memset

(num,0,

sizeof

(num));

//因為是對於每一種coin來說所用的數量

}for

(int i=

1;i<=m;i++

)printf

("%d\n"

,ans);}

return0;

}

POJ 1742多重揹包問題

include include include include includeusing namespace std define maxn 105 define maxl 100005 int weight maxn c maxn f maxl user maxl int main printf ...

poj 1742 Coins 多重揹包

題意很簡單,有n種硬幣,每種硬幣面額多大,有多少個,求可以構成m以內的面額有多少種。開始用的是普通的多重揹包的求法,裸裸的超時了,看了別人的 發現可以優化很多。用usea這個來儲存用來多少個a硬幣,避免的很多無用的計算。先貼以前超時的 include include int dp 100005 in...

POJ 1742 Coins DP 多重揹包

有nn 種面值不同的硬幣,每種有c i c i 個。求1到m m有多少面值可以用這些硬幣湊成?很明顯的完全揹包。前面wa,t le,r e,ce wa,t le,r e,ce 全是用二進位制拆分做的。後來實在沒辦法打了書上的方法。設f i f i 為面值為i i可否得到。那麼最基本的o t nm2 ...