c语言算法—01背包问题(一维表达形)

经过上次我们用基础的算法解决了背包问题之后,现在我们来看另外一种算法:通过一维数组表达;

其实,在上次我们使用二维数组时可以发现,我们在从上往下建立(横向建立)的时候,数据是一行一行成型的,而新的数据是在原先一排旧的基础上更新形成的,所以,我们来想,我们其实并不需要储存旧的数据,而可以直接在同一个位置上进行数据的更新,永远只保存新的位置上的数据;

如果这样的话,我们就只需要一个m+1长的一维数组了。

#include
#include
#include
#define max(a,b)(a>b? a:b)
int n,m;
int main()
{
    scanf("%d%d",&m,&n);
    int *a=(int *)malloc(sizeof(int)*(m+1));
    memset(a,0,sizeof(int)*(m+1)); 
    for(int i=1;i<=n;++i)
    {
        int w,p;
        scanf("%d%d",&w,&p);
        for(int j=m;j>=0;--j)
        {
            if(j-w>=0)
            a[j]=max(a[j],a[j-w]+p);
        }
    }
    printf("%d",a[m]);
    return 0;
} 

在这个代码中,一定要注意,一维数组的建立一定是逆序创建的,即j一定是逆序的。

你可能感兴趣的:(C,Algorithm)