01背包 一维数组写的01背包

来源:互联网 发布:centos 个人 编辑:程序博客网 时间:2024/06/15 23:09
#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,j,w[10],p[10],m,f[100];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1; i<=m; i++)
            scanf("%d%d",&w[i],&p[i]);
        memset(f,0,sizeof(f));
        for(i=1; i<=m; i++)
            for(j=10; j>=w[i]; j--)
                if(f[j-w[i]]+p[i]>f[j])
                    f[j]=f[j-w[i]]+p[i];//不放和在j-w[i](因为要给其他的留有尽可能多的空间所以i物体
        printf("%d\n",f[n]);//的空间为w[i],其他物体的空间为j-w[i],f[j-w[i]]存放的是在j-w[i]空间下的最大值)
    }//空间下且i物体还没有放过进行比较
    return 0;
}/*完全背包是在不放和在j-w[i]的空间下(已确定放或是不放i物体的情况下的最大值)
放i物体的价值进行的比较*/
//完全背包代码
for(i=1;i<=m;i++)
    for(j=w[i];j<=m;j++)
        if(f[j-w[i]]+p[i]>f[j])
            f[j]=f[j-w[i]]+p[i];
/*最大的区别就在去01背包是在j-w[i]没有放过i物体的情况下比较放或者是不放
而完全背包就是在j-w[i]的空间下已确定i物体时放进去好还是不好*/
0 0