开始没注意题目中的数据大小,直接手敲未优化的多重背包,结果TLE到死,加上二进制优化才勉强过了,后来翻了翻背包九讲,才发现自己原来的写法多挫,,,
实际上是不难的题目,按背包九讲内的形式写一个多重背包就能完美解决
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int V; //背包容量
void ZeroOnePack(int Array[], int Cost, int Value)
{
//========================================
//使用前注意初始化数组,不要求装满初始化为0,装满除Array[0]=0外其他初始化为负无穷
for(int v = V; v >= Cost; v--)
if (Array[v-Cost]+Value>Array[v])
Array[v]=Array[v-Cost]+Value;
}
void CompletePack(int Array[], int Cost, int Value)
{
//========================================
//使用前注意初始化数组,不要求装满初始化为0,装满除Array[0]=0外其他初始化为负无穷
for(int v = Cost; v <= V; v++)
if (Array[v-Cost]+Value>Array[v])
Array[v]=Array[v-Cost]+Value;
}
void MultiplePack(int Array[],int Cost,int Value, int Count)
{
if (Value*Count>=V)
{
CompletePack(Array,Cost,Value);
}
else
{
int k=1;
while (k<Count)
{
ZeroOnePack(Array,k*Cost,k*Value);
Count-=k;
k*=2;
}
ZeroOnePack(Array,Count*Cost,Count*Value);
}
}
int dp[110000];
int main()
{
int n;
int c[110],k[110];
while (scanf("%d%d",&n,&V)&&(n||V))
{
for (int i=0;i<n;i++)
{
scanf("%d",&c[i]);
}
for (int j=0;j<n;j++)
{
scanf("%d",&k[j]);
}
memset(dp,0,sizeof (dp));
for (int i=0;i<n;i++)
{
MultiplePack(dp,c[i],c[i],k[i]);
}
int cnt=0;
for(int i=1;i<=V;i++)
if (dp[i]==i)
cnt++;
printf("%d\n",cnt);
}
return 0;
}