HDOJ Big Event in HDU 多重背包

来源:互联网 发布:免费地磅称重软件 编辑:程序博客网 时间:2024/05/16 12:36

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

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

#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;}


原创粉丝点击