这是c++刷题的Day1
💯题目描述
给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。
Input
多组数据,每组数据前两个数字为n,m。n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数。 (n<=100,m<=100000,面额<=100000,每种个数<=1000)
Output
RT
Sample Input
3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0
Sample Output
8
4
🔑思路
bitset+dp
💯CODE代码:
#include <bits/stdc++.h>
using namespace std ;
bitset < 100010 > f ;
int n , m ;
struct Node {
int a , b ;
} cs[110] ;
void T (int a , int b) {
if (a > m)
return ;
int res = 1 ;
while (b >= res) {
f |= f << (res * a) ;
b -= res ;
res <<= 1 ;
if (res * a > m)
return ;
}
if (b)
dp |= dp << (a * b) ;
}
int main () {
while (cin >> n >> m && n) {
for (int i = 0; i < n; i ++)
cin >> cs[i].a ;
for (int i = 0; i < n; i ++)
cin >> cs[i].b ;
f.reset () ;
f.set (0) ;
for (int i = 0; i < n; i ++)
T (cs[i].a , cs[i].b) ;
int res = 0 ;
for (int i = 1; i <= m; i ++)
res += f.test (i) ;
cout << res << endl ;
}
}