人間夜行

一切の有為の法 夢幻泡影の如し

RQNOJ 5 采药

| 评论

//本次将讨论0/1背包的空间优化问题。
//这是未优化的。显然数组开不大。
#include <stdio.h>
int max(int a,int b)
{
    if(a>b) return a;
    else return b;
}
int main()
{
    int t,m;
    int v[101],c[101],f[101][1001];
    int i,r;
    scanf("%d%d",&t,&m);
    for(i=1;i<=m;i++) scanf("%d%d",&c[i],&v[i]);
    for(r=0;r<=t;r++) if(r<c[1]) f[1][r]=0; else f[1][r]=v[1];
    for(i=2;i<=m;i++)
        for(r=0;r<=t;r++) 
            if(r>=c[i])
                f[i][r]=max(f[i-1][r],f[i-1][r-c[i]]+v[i]);
            else
                f[i][r]=f[i-1][r];
    printf("%d",f[m][t]);
    return 0;
}
/*------------------------华丽丽----------------------------*/
//优化过的。
//事实上f[i][r]一开始用的还是f[i-1][r]的值,因此实际上只需要一个数组。
#include <stdio.h>
int max(int a,int b)
{
	if(a>b) return a;
	else return b;
}
int main()
{
	int t,m;
	int v[101],c[101],f[1001];
	int i,r;
	scanf("%d%d",&t,&m);
	for(i=1;i<=m;i++) scanf("%d%d",&c[i],&v[i]);
	for(r=0;r<=t;r++) if(r<c[1]) f[r]=0; else f[r]=v[1];
	for(i=2;i<=m;i++)
//关键!为保证本次所需要的未用数据不改变,令r递减。
		for(r=t;r>=0;r--) 
			if(r>=c[i])
				f[r]=max(f[r],f[r-c[i]]+v[i]);
			else
				f[r]=f[r];
	printf("%d",f[t]);
	return 0;
}

评论