#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> w(n+5,0),cnt(n+5,0);
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=n;i++)cin>>cnt[i];
unordered_map<int,int> dp;
dp[0]=1;
for(int i=1;i<=n;i++)
{
vector<int> t;
for(auto x:dp)
{
int val=x.first;
for(int j=1;j<=cnt[i];j++){
t.push_back(val+j*w[i]);
}
}
for(int val:t)
{
dp[val]=1;
}
}
cout<<dp.size()<<endl;
return 0;
}
/*很经典的多重背包,好就没写了。就有些吃力了。这题set,map都可以,因为数据有点大,
所以数组肯定存不了那么大的下标,所以我们采取哈希,也就是map。首先是dp[0]=1,这算一种。
然后再依次遍历每组的w[i]的倍数,把dp里面已经有的数跟这些重量塞进一个临时的vector。
然后再把vector,t的每个数值标记为1.你要是map的键值搞bool类型也阔以。最后输出大小就行
*/

京公网安备 11010502036488号