zoukankan      html  css  js  c++  java
  • hdu 2844 多重背包二进制优化

    //http://www.cnblogs.com/devil-91/archive/2012/05/16/2502710.html

    #include<stdio.h>

    #define N 110000
    #include<string.h>
    int dp[N];
    int main() {
    int n,m,i,j,a[N],b[N],k,h;
    while(scanf("%d%d",&n,&m),n||m) {
    memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(i=1;i<=n;i++)
    scanf("%d",&b[i]);
    dp[0]=1;
    for(i=1;i<=n;i++) {
    if(b[i]*a[i]>=m) {
    for(j=a[i];j<=m;j++) {
    if(dp[j-a[i]]==0)continue;
    dp[j]=1;
    }
    }
    else {
    k=b[i];
    h=1;
    while(k>=h) {
    for(j=m;j>=h*a[i];j--) {
    if(dp[j-h*a[i]]==0)continue;
    dp[j]=1;
    }
    k-=h;h*=2;
    }
    if(k>0) {
    for(j=m;j>=k*a[i];j--) {
    if(dp[j-k*a[i]]==0)continue;
    dp[j]=1;
    }
    }
    }
    }
    j=0;
    for(i=1;i<=m;i++)
    if(dp[i]==1)
    j++;
    printf("%d ",j);
    }
    return 0;
    }
  • 相关阅读:
    学习记录18
    学习记录17
    学习记录16
    小白的心酸连网历程
    学习记录15
    学习记录14
    学习记录13
    学习记录12
    学习记录10
    语法糖
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410853.html
Copyright © 2011-2022 走看看