BZOJ 1531: [POI2005]Bank notes( 背包 )

多重背包...

----------------------------------------------------------------------------

#include<bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < n; i++)

#define clr(x, c) memset(x, c, sizeof(x))

using namespace std;

const int maxn = 209, maxk = 20009, inf = 0x3f3f3f3f;

int n, b[maxn], c[maxn], K, dp[maxk];

int main() {

freopen("test.in", "r", stdin);

cin >> n;

rep(i, n) scanf("%d", b + i);

rep(i, n) scanf("%d", c + i);

cin >> K;

clr(dp, inf), dp[0] = 0;

rep(i, n) {

for(int j = 1; j <= c[i]; c[i] -=j, j <<= 1)

for(int k = K; k >= j * b[i]; k--)

dp[k] = min(dp[k], dp[k - j * b[i]] + j);

if(c[i])

for(int k = K; k >= c[i] * b[i]; k--)

dp[k] = min(dp[k], dp[k - c[i] * b[i]] + c[i]);

}

cout << dp[K] << "\n";

return 0;

}

----------------------------------------------------------------------------

1531: [POI2005]Bank notes

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 286  Solved: 147
[Submit][Status][Discuss]

Description

Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.

Input

第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,..., bn, 1 <= b1 < b2 < ... < b n <= 20 000, 第三行 n 个整数c1, c2,..., cn, 1 <= ci <= 20 000, 表示每种硬币的个数.最后一行一个数k – 表示要凑的面值数量, 1 <= k <= 20 000.

Output

第一行一个数表示最少需要付的硬币数

Sample Input

3
2 3 5
2 2 1
10

Sample Output

3

HINT

Source

时间: 2024-10-25 03:40:34

BZOJ 1531: [POI2005]Bank notes( 背包 )的相关文章

BZOJ 1531 POI2005 Bank notes 多重背包

题目大意:多重背包 一大早就水了个题233 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 20200 using namespace std; int n,k,b[220],c[220]; int f[M]; int main() { int i,j,k; cin>>n; for(i=1;i<=n;i++) sc

BZOJ 1531 POI2005 Bank notes

多重背包问题,二进制拆分后做~ #include <cstdio> #include <algorithm> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) typedef long long ll; ll n,x; ll num[205],value[205],Aim,

1531: [POI2005]Bank notes二进制优化(c++)

Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. Input 第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,..., bn, 1 <= b1 < b2 < ... < b n <= 20 000, 第三行 n 个整数c1, c2,...,

【BZOJ 1531】 [POI2005]Bank notes

1531: [POI2005]Bank notes Time Limit: 5 Sec Memory Limit: 64 MB Submit: 271 Solved: 139 [Submit][Status][Discuss] Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,-, bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. Input 第一行一个数 n, 1

BZOJ1531: [POI2005]Bank notes

1531: [POI2005]Bank notes Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 229  Solved: 119[Submit][Status] Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. Input 第一行一个数 n, 1 <= n <

【bzoj1531】[POI2005]Bank notes 多重背包dp

题目描述 Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. 输入 第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,..., bn, 1 <= b1 < b2 < ... < b n <= 20 000, 第三行 n 个整数c1, c2,..., cn, 1 <

luogu P3423 [POI2005]BAN-Bank Notes

Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,…, bn. 但是每种硬币有数量限制ci,现在我们想要凑出面值k求最少要用多少个硬币. n<=200,bi<=20000,ci<=20000 还要输出方案.... 这道题第一眼多重背包,然后打了 ,65分,开O2 70分.. 我们可以换个思路,何必枚举每种货币选多少个,每次只拿一个,只要记录一下前面状态拿了多少个,判断还有没有剩余就好了. 当然,第一维for循环

BZOJ 1537: [POI2005]Aut- The Bus(dp + BIT)

对y坐标离散化, 然后按x坐标排序, dp. 一个点(x, y), 设到达这个点接到的最多乘客数为t, 那么t可以用来更新y'>=y的所有点.用树状数组维护最大值. --------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int maxn = 100009; int N; #def

Bzoj 1537: [POI2005]Aut- The Bus 题解 [由暴力到正解]

1537: [POI2005]Aut- The Bus Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 264[Submit][Status][Discuss] Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个数(i, j) 表示(1 <= i <= n, 1 <= j