大家都过了,我也来凑热闹了!最简单的01背包(也可以说是完全背包)!我将它01化了,很简单;代码在下面,有什么不懂的可以来问我!欢迎大家提问:
#include <iostream>
using namespace std;
int flag[1100000];
int sign[1100000];
inline int max(int a, int b)
{
return a > b ? a : b ;
}
int Dp (int cash, int index)
{
int i, j;
memset(sign,0,sizeof(sign));
for (i = 0; i <= index; i++)
for (j = cash; j >= flag[i]; j--)
{
sign[j] = max(sign[j],sign[j-flag[i]]+flag[i]);
}
return sign[cash];
}
int main()
{
int cash,n;
while(scanf("%d%d",&cash,&n) != EOF)
{
int index = 0 ;
int num , temp ;
for (int i = 0;i < n; i++)
{
int pow = 1;
scanf("%d%d",&num,&temp);
while(1)
{
if( pow >= num )
{
flag[index++] = temp * num;
break;
}
else
{
flag[index++] = temp * pow;
num = num - pow;
pow *= 2 ;
}
}
}
cout << Dp(cash,index-1) <<endl;
}
return 0;
}