NUBT 1480 懒惰的风纪委Elaine

来源:互联网 发布:java获取整数位数 编辑:程序博客网 时间:2024/05/02 04:23

链接:点击打开链接

题意:找出Elaine能用卷轴到达的街道数量。

思路:多重背包问题,我们可以用二进制拆分来做,x=1+2+4+8+一个奇数。。如果DP【j-y*a[i]】!=-1,那么DP【j】肯定可以到达。不要往级最后一个奇数也要加入背包。。。。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,m;int dp[1100],a[110],b[110];int main(){int i,j,z,x,y;while(~scanf("%d %d",&n,&m)){if(n==0&&m==0)break;for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++)scanf("%d",&b[i]);for(i=0;i<n;i++)if(a[i]>m){a[i]=0;b[i]=0;}memset(dp,-1,sizeof(dp)); dp[0]=0; for(i=0;i<n;i++){x=b[i],y=1;while(x>y){for(j=m;j>=y*a[i];j--) if(dp[j-y*a[i]]!=-1)  dp[j]=1;  x-=y;  y*=2;} for(j=m;j>=x*a[i];j--) if(dp[j-x*a[i]]!=-1) dp[j]=1;}z=0;for(i=1;i<=m;i++)if(dp[i]==1)z++;printf("%d\n",z);}return 0;}