poj 1742 Coins

#include<iostream>
using namespace std;
int v[105],c[105],b[100005][2];
int main()
{
int n,m,i,j,count,num;
while(scanf("%d%d",&n,&m),n&&m)
{
memset(b,
0,sizeof(b));
for(i=1;i<=n;i++)
scanf(
"%d",&v[i]);
for(i=1;i<=n;i++)
scanf(
"%d",&c[i]);
b[
0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
b[j][
1]=0;
for(j=v[i];j<=m;j++)
if(b[j][0]==0)
{
num
=j-v[i];
if(b[num][0]!=0&&b[num][1]<c[i])
{
b[j][
0]=1; //b[j][0]=1表示硬币价值之和可以为j
b[j][1]=b[num][1]+1; //b[j][1]表示硬币价值之和达到j时,当前的第i种硬币用了多少次
}
}
}
count
=0;
for(i=1;i<=m;i++)
{
if(b[i][0]!=0)
count
++;
}
printf(
"%d\n",count);
}
return 0;
}

  

多重背包,tle,可能是卡在常数上
#include<iostream>            //多重背包,tle,可能是卡在常数上
using namespace std;
int n,m,a[250],c[250],dp[100005],weigh[50000];
int main()
{
while(scanf("%d%d",&n,&m)&&n)
{
for(int i=1;i<=n;++i)
scanf(
"%d",&a[i]);
int l=1;
for(int i=1;i<=n;++i)
{
scanf(
"%d",&c[i]);
int j=1,t=c[i];
while(t>=j)
{
weigh[l
++]=a[i]*j;
t
-=j;
j
+=j;
}
weigh[l
++]=a[i]*t;
}
memset(dp,
0,sizeof(dp));
dp[
0]=1;
for(int i=1;i<l;++i)
{
for(int j=m;j>=weigh[i];--j)
dp[j]
=max(dp[j],dp[j-weigh[i]]);
}
int s=0;
for(int i=1;i<=m;++i)
s
+=dp[i];
printf(
"%d\n",s);
}
return 0;
}

  

posted on 2011-07-22 20:06  sysu_mjc  阅读(112)  评论(0编辑  收藏  举报

导航