//多重背包问题
//dp数组为 1 表示能够凑够当前的钱数,否则为 0
//used数组用来记录对于当前的第i coins,已经使用了多少次(注意是对于相关的钱数的使用的次数)
#include <iostream>
#include <cstring>
using namespace std;
int a[105], b[105], dp[100050], used[100050];
int main()
{
int n, m;
while (cin >> n >> m&&n&&m){
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= n; i++)cin >> b[i];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int ans = 0;
for (int i = 1; i <= n; i++){
memset(used, 0, sizeof(used));
for (int j = a[i]; j <= m; j++){
if (dp[j] == 0 && dp[j - a[i]] == 1 && used[j - a[i]] < b[i]){
//当前钱数没有凑够过,且j-a[i]凑够了,,且凑j-a[i]一共用的a[i]的次数少于b[i]
dp[j] = 1;
ans++;
used[j] = used[j - a[i]] + 1;
}
}
}
cout << ans << endl;
}
return 0;
}
poj1742(多重背包)
最新推荐文章于 2019-11-19 20:15:38 发布