游客 Signup | Login
中文 | En

1495 - 采药

通过次数

0

提交次数

0

Time Limit : 1 秒 Memory Limit : 32 MB

辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。

为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。
医师把他带到个到处都是草药的山洞里对他说:
“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。
我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?

Input

输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。

接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采摘某株草药的时间和这株草药的价值。

Output

可能有多组测试数据,对于每组数据,

输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

Examples

Input Format

42 6
1 35
25 70
59 79
65 63
46 6
28 82
962 6
43 96
37 28
5 92
54 3
83 93
17 22
0 0

Output Format

117
334

Solution C

#include <stdio.h>
int n,m;
int run()
{
        int i,j,a[111],b[111],d[111][1111],k;
        for(i=1;i<=m;i++)
                scanf("%d%d",&a[i],&b[i]);
        for(i=0;i<=m;i++)
                for(j=0;j<=n;j++)
                        d[i][j]=0;
        for(i=0;i<m;i++)
                for(j=0;j<=n;j++)
                        for(k=0;k<=1;k++)
                                if((j+k*a[i+1]<=n)&&(d[i+1][j+k*a[i+1]]<d[i][j]+k*b[i+1]))
                                        d[i+1][j+k*a[i+1]]=d[i][j]+k*b[i+1]; 
        j=0;
        for(i=0;i<=n;i++)
                if(d[m][i]>j)
                        j=d[m][i];
        printf("%d\n",j);
}
int main()
{
        scanf("%d%d",&n,&m);
        while(n!=0)
        {
                run();
                n=0;
                scanf("%d%d",&n,&m);
        }
        return 0;
}

Solution C++

#include <stdio.h>
int n,m;
int run()
{
	int i,j,a[111],b[111],d[111][1111],k;
	for(i=1;i<=m;i++)
		scanf("%d%d",&a[i],&b[i]);
	for(i=0;i<=m;i++)
		for(j=0;j<=n;j++)
			d[i][j]=0;
	for(i=0;i<m;i++)
		for(j=0;j<=n;j++)
			for(k=0;k<=1;k++)
				if((j+k*a[i+1]<=n)&&(d[i+1][j+k*a[i+1]]<d[i][j]+k*b[i+1]))
					d[i+1][j+k*a[i+1]]=d[i][j]+k*b[i+1]; 
	j=0;
	for(i=0;i<=n;i++)
		if(d[m][i]>j)
			j=d[m][i];
	printf("%d\n",j);
}
int main()
{
	scanf("%d%d",&n,&m);
	while(n!=0)
	{
		run();
		n=0;
		scanf("%d%d",&n,&m);
	}
	return 0;
}