#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类型也阔以。最后输出大小就行
*/