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