O(NM)的多重背包
不给自己写讲解,下次再遇到,不会再看一遍,从感觉没理解透
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
bool dp[100000];
int cnt[100000];
int num[100], value[100];
int N, M;
int main(){
while( cin >> N >> M && !( N == 0 && M == 0 ) ){
for( int i = 0; i < N; i++ ){
scanf( "%d", &value[i] );
}
for( int i = 0; i < N; i++ ){
scanf( "%d", &num[i] );
if( num[i] * value[i] > M ){
num[i] = M / value[i];
}
}
for( int i = 0; i <= M; i++ ){
dp[i] = false;
}
dp[0] = true;
for( int i = 0; i < N; i++ ){
for( int j = 0; j < M; j++ ){
cnt[j] = 0;
}
for( int j = value[i]; j <= M; j++ ){
if( !dp[j] && dp[j-value[i]] && cnt[j-value[i]] < num[i] ){
dp[j] = true;
cnt[j] = cnt[j-value[i]] + 1;
}
}
}
int ans = 0;
for( int i = M; i > 0; i-- ){
ans += dp[i];
}
cout << ans << endl;
}
return 0;
}