当前位置: 代码迷 >> 综合 >> HDOJ Big Event in HDU 多重背包
  详细解决方案

HDOJ Big Event in HDU 多重背包

热度:24   发布时间:2024-01-20 20:39:11.0

第一次遇到这样的题,平分= =,还要回去好好想一下...

这么水的... 不懂啊= =

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;int main()
{int n,m;int a[101],c[101];int DP[100001];while( scanf( "%d %d",&n,&m )!=EOF ){if( n==0 && m==0 )break;for( int i=1;i<=n;i++ )scanf( "%d",&a[i] );for( int i=1;i<=n;i++ )scanf( "%d",&c[i] ); for( int i=0;i<=m;i++ )DP[i]=0;DP[0]=1;for( int i=1;i<=n;i++ )for( int j=0;c[i];j++ ){if( c[i]>(1<<j) ){for( int k=m;k>=a[i]*(1<<j);k-- )if( DP[k-a[i]*(1<<j)] )DP[k]=1;c[i]-=(1<<j);}else{for( int k=m;k>=a[i]*c[i];k-- )if( DP[k-a[i]*c[i]] )DP[k]=1;c[i]=0;}}int sum=0;for( int i=1;i<=m;i++ )sum+=DP[i];printf( "%d\n",sum );}return 0;
}


  相关解决方案