题解:P10973 Coins
chase_the_light · · 题解
比较模板的一道题。
遇到这样的题目,首先可以想到拆分,但是显然地,直接把每个物品拆分成
于是可以获得转移方程。令
代码就很好写了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
using ll=long long;
bool dp[N];
int n,m,a[N],v[N],cnt,ans;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
while(1){
cin>>n>>m;
if(!(n||m)) break;
for(int i=1;i<=n;i++) cin>>a[i];
dp[0]=1;cnt=0;
for(int i=1;i<=m;i++) dp[i]=0;
for(int i=1,c;i<=n;i++){
cin>>c;
for(int j=1;j<=c;c-=j,j<<=1){
v[++cnt]=j*a[i];
}
if(c) v[++cnt]=a[i]*c;
}
for(int i=1;i<=cnt;i++){
for(int j=m;j>=v[i];j--){
dp[j]|=dp[j-v[i]];
}
}
ans=0;
for(int i=1;i<=m;i++) ans+=dp[i];
cout<<ans<<'\n';
}
return 0;
}