/*
* 多重背包问题*
*POJ_1276:Cash Machine*
*/
#include<stdio.h>
void change(int *f,int v,int cash)
{
int j=cash;
int m;
while(j>=v)
{
m=j-v;
if(f[j]<f[m]+v)
{
f[j]=f[m]+v;
}
j--;
}
}
int main(void)
{
int n;//机子种类
int i,j;
int rank;
int nk,dk;
int v;
unsigned int cash;//现金
while(scanf("%d%d",&cash,&n)!=EOF)
{
int f[cash+1];
for(i=0;i<=cash;i++)
{
f[i]=0;
}//初始化
for(i=0;i<n;i++)
{
scanf("%d%d",&nk,&dk);
rank=1;
while(2*rank-1<=nk)
{
v=rank*dk;//重量直接大于背包,则删除
if(v<=cash)
{
change(f,v,cash);
}
rank=2*rank;
}
rank=nk-rank+1;
if(rank!=0)
{
v=rank*dk;
if(v<=cash)
{
change(f,v,cash);
}
}
}
//转换成0-1背包问题
printf("%d\n",f[cash]);
}
return 0;
}
* 多重背包问题*
*POJ_1276:Cash Machine*
*/
#include<stdio.h>
void change(int *f,int v,int cash)
{
int j=cash;
int m;
while(j>=v)
{
m=j-v;
if(f[j]<f[m]+v)
{
f[j]=f[m]+v;
}
j--;
}
}
int main(void)
{
int n;//机子种类
int i,j;
int rank;
int nk,dk;
int v;
unsigned int cash;//现金
while(scanf("%d%d",&cash,&n)!=EOF)
{
int f[cash+1];
for(i=0;i<=cash;i++)
{
f[i]=0;
}//初始化
for(i=0;i<n;i++)
{
scanf("%d%d",&nk,&dk);
rank=1;
while(2*rank-1<=nk)
{
v=rank*dk;//重量直接大于背包,则删除
if(v<=cash)
{
change(f,v,cash);
}
rank=2*rank;
}
rank=nk-rank+1;
if(rank!=0)
{
v=rank*dk;
if(v<=cash)
{
change(f,v,cash);
}
}
}
//转换成0-1背包问题
printf("%d\n",f[cash]);
}
return 0;
}