直接用多重背包,超时
#include<iostream>
#include<algorithm>
#define INF 1000
using namespace std;
int main()
{
int n,m;
while (cin >> n >> m, m,n)
{
int *c= new int[n];
int *w= new int[n];
int *num = new int[n];
for (int i = 0; i < n; i++)
cin >> c[i], w[i] = c[i];
for (int i = 0; i < n; i++)
cin >> num[i];
int sum = 0;
for (int i = 0; i < n; i++)
sum += c[i] * num[i];
int *dp = new int[m+1];//多开一个单位长度
for (int i = 0; i <= m; i++)
dp[i] = -INF;
dp[0] = 0;
for (int i = 0; i <n; i++)
for (int k = 1; k <=num[i]; k++)
for (int j = m; j >= c[i]; j--)
dp[j] = max(dp[j], dp[j - w[i]] + c[i] );
int cnt = 0;
for (int i = 1; i <=m; i++)
if (dp[i] == i)
cnt++;
cout << cnt << endl;
}
system("pause");
}
进行二进制优化
#include<iostream>
#include<algorithm>
#define MAX 1000000
using namespace std;
int c[MAX], w[MAX],num[MAX];
int dp[MAX];
int main()
{
int n, m;
while (cin >> n >> m, m + n)
{
for (int i = 0; i < n; i++)
cin >> c[i], w[i] = c[i];
for (int i = 0; i < n; i++)
cin >> num[i];
for (int i = 0; i <= m; i++)
dp[i] = 0;
for (int i = 0; i < n; i++)
{
for (int k = 1; k <= num[i]; k = 2 * k)
{
num[i] -= k;
for (int j = m; j >= w[i] * k; j--)
dp[j] = max(dp[j], dp[j - k*w[i]] + k*c[i]);
}
if (num[i])
{
for (int j = m; j >= w[i] * num[i]; j--)
dp[j] = max(dp[j], dp[j - w[i] * num[i]] + c[i] * num[i]);
}
}
int cnt = 0;
for (int i = 1; i <= m; i++)
if (dp[i] == i)
cnt++;
cout << cnt << endl;
}
}