Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn't know the exact price of the watch.
You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
8 4
#include<iostream>
#include<algorithm>
#include<string.h>
#define INF 0x3f3f3f3f
using namespace std;
//手表价格
int m;
//单位货币的价值
int val[1005];
//单位货币的数量
int vol[1005];
int dp[100005];
void Zero(int cost){
for(int i=m;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+cost);
}
//val*vol>>m,硬币可以无限使用,可以使用完全背包
void Com(int cost){
for(int i=cost;i<=m;i++)
dp[i]=max(dp[i],dp[i-cost]+cost);
}
//拆分vol,价格系数k*vol组成新硬币
void mul(int val,int vol){
if(val*vol>=m)
Com(val);
else{
int k=1;
while(k<=vol){
Zero(k*val);
vol-=k;
k*=2;
}
Zero(vol*val);
}
}
int main(){
//货币的种类
int n;
while(cin>>n>>m,(n||m)){
for(int i=1;i<=n;i++)
cin>>val[i];
for(int i=1;i<=n;i++)
cin>>vol[i];
memset(dp,0,sizeof(dp));
for(int i=0;i<=m;i++)
dp[i]=-INF;
dp[0]=0;
for(int i=1;i<=n;i++)
mul(val[i],vol[i]);
int ans=0;
for(int i=1;i<=m;i++)
if(dp[i]>0)
ans++;
cout<<ans<<endl;
}
return 0;
}