Coins
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 107 Accepted Submission(s) : 44
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
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.
Input
Output
Sample Input
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
Sample Output
8 4 多重揹包,還是套模板的。。
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#define MAX(x,y) x>y?x:y;
#define MIN(x,y) x<y?x:y;
using namespace std;
int dp[100005],v[110],c[110],m;
void zeroonepack(int c,int w)
{
int i;
for(i=m;i>=c;i--)
{
dp[i]=MAX(dp[i],dp[i-c]+w);
}
}
void compeletepack(int c,int w)
{
int i;
for(i=c;i<=m;i++)
{
dp[i]=MAX(dp[i],dp[i-c]+w);
}
}
void multipack(int c,int w,int amount)
{
int k;
if(c*amount>=m)
{
compeletepack(c,w);
return ;
}
else
{
k=1;
while(k<=amount)
{
zeroonepack(c*k,w*k);
amount-=k;
k*=2;
}
zeroonepack(c*amount,w*amount);
}
}
int main()
{
int n,i,j,sum;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
{
break;
}
for(i=0;i<n;i++)
cin>>v[i];
for(i=0;i<n;i++)
cin>>c[i];
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
multipack(v[i],v[i],c[i]);
}
sum=0;
for(i=1;i<=m;i++)
{
if(dp[i]==i)
{
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}