POJ Coins

来源:互联网 发布:sql 超出日期范围 编辑:程序博客网 时间:2024/06/05 17:49
//#include <iostream>
//#include <string.h>
//#include <stdlib.h>
//#include <stdio.h>
//
//using namespace std;
//#define N 100000 + 10
//
//int cost[N], num[N], w[N], f[N];
//int n, m;
//
//void zeroonepack( int totv, int w)
//{
//    for( int i = m; i >= totv; i--)
//      f[i] = max(f[i], f[i - totv] +  w);
//    return ;
//}
//
//void mutipack( int totv, int w)
//{
//    for( int i = totv; i <= m; i++)
//     f[i] = max(f[i], f[i - totv] + w);
//}
//
//int main()
//{
//    while(scanf("%d %d", &n, &m) != EOF &&( n + m))
//    {
//        int ans = 0;
//        for( int i = 0; i < n; i++)
//        {
//           scanf("%d", &w[i]);
//           cost[i] = w[i];
//        }
//         memset(f, 0, sizeof(f));
//
//        for( int i = 0; i < n; i++)
//        {
//           scanf("%d",&num[i]);
//           if(num[i] * cost[i] >= m)
//              mutipack(cost[i], w[i]);
//           else
//           {
//               int cnt = 1;
//               while(cnt < num[i])
//               {
//                   zeroonepack(cost[i] * cnt, w[i] * cnt);
//                   num[i] -= cnt;
//                   cnt *= 2;
//               }
//               zeroonepack(num[i] * cost[i], w[i] * num[i]);
//           }
//        }
//
//        for( int i = 1; i <= m ;i++ )
//           if(f[i] != f[i-1]) ans++;
//        printf("%d\n",ans);
//    }
//}

上面的可以过杭电的,多重背包模板
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


using namespace std;
#define N 100000 + 100


int num[N], w[N], f[N], cnt[N];
int n, m;


int main()
{
   while(scanf("%d %d",&n , &m) != EOF &&(n + m))
   {
       for( int i = 0; i < n; i++)
        scanf("%d",&w[i]);
       for( int i = 0; i < n; i++)
        scanf("%d", &num[i]);


       memset(f, 0, sizeof(f));
       f[0] = 1;
       int ans = 0;


       for( int i = 0; i < n; i++)
       {
           memset(cnt , 0, sizeof(cnt));
           for( int j = w[i]; j <= m; j++)
           {
               if(!f[j] && f[j - w[i]] && cnt[j-w[i]] < num[i]) 要注意下 是<而不是<=, 
               {
                   f[j] = true;
                   cnt[j] = cnt[j-w[i]] + 1;
                   ans++;
               }
           }
       }
       printf("%d\n",ans);
   }
   return 0;
}
0 0