题目链接:HDU 2844 Coins(多重背包 + 二进制优化 + 01背包)
多重背包 + 二进制优化 + 01背包。
跟poj那个dividing差不多,只是最后要求的m内的种类和,不多说了。
g++ TLE,c++ AC。。。
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
const int MAX_N = 100 + 10;
const int MAX_M = 100000 + 1000;
int dp[MAX_M];
int new_value[MAX_N * MAX_N];
int value[MAX_N];
int num[MAX_N];
int n,m;
int main()
{
while(cin >> n >> m,n + m)
{
for(int i = 1;i <= n;i++)
cin >> value[i];
for(int i = 1;i <= n;i++)
cin >> num[i];
memset(dp,0,sizeof(dp));
int k = 0;
int t;
for(int i = 1;i <= n;i++)
{
t = 1;
while(num[i] - t > 0)
{
new_value[k++] = t * value[i];
num[i] -= t;
t = t << 1;
}
new_value[k++] = num[i] * value[i];
}
for(int i = 0;i < k;i++)
{
for(int j = m;j >= new_value[i];j--)
{
dp[j] = max(dp[j],dp[j - new_value[i]] + new_value[i]);
}
}
int ans = 0;
for(int i = 1;i <= m;i++)
{
if(dp[i] == i)
ans++;
}
cout << ans << endl;
}
return 0;
}