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