01背包问题

二位数组实现01背包算法:

#include<stdio.h>
int main()
{
    int max(int x,int y);
    int v,n,a[105],b[105],c[105][105],i,j;
    scanf("%d %d",&v,&n);
    for(i=1;i<=n;i++)
        scanf("%d %d",&a[i],&b[i]);
    for(i=1;i<=n;i++)
        for(j=1;j<=v;j++)
        {
        if(a[i]>j)
        c[i][j]=c[i-1][j];
        else
        c[i][j]=max(c[i-1][j],(c[i-1][j-a[i]]+b[i]));
        }
        printf("%d
",c[n][v]);
}
int max(int x,int y)
{
    if(x>=y)
    return x;
    else
        return y;
}

一维数组实现01背包算法:

#include<iostream>
#include<cstring>
using namespace std;
int cheak[2000][2000];
int main()
{
    int m,n,v[1005],val[1005],dp[2000];
    while(cin>>m>>n)
    {
        memset(dp,0,sizeof(dp));
        memset(cheak,0,sizeof(cheak));
        for(int i=1;i<=n;++i)
            cin>>v[i]>>val[i];
        for(int i=n;i>=1;--i)
            for(int j=m;j>=v[i];--j)
        {
            if(dp[j]<(dp[j-v[i]]+val[i]))
            {
                dp[j]=dp[j-v[i]]+val[i];
                cheak[i][j]=1;
            }
        }
        cout<<dp[m]<<endl;
     }
}

01背包取的物品是那些,取物品路径,价值,容量:

#include<iostream>
#include<cstring>
using namespace std;
int cheak[2000][2000];
int main()
{
    int m,n,v[1005],val[1005],dp[2000];
    while(cin>>m>>n)
    {
        memset(dp,0,sizeof(dp));
        memset(cheak,0,sizeof(cheak));
        for(int i=1;i<=n;++i)
            cin>>v[i]>>val[i];
        for(int i=n;i>=1;--i)
            for(int j=m;j>=v[i];--j)
        {
            if(dp[j]<(dp[j-v[i]]+val[i]))
            {
                dp[j]=dp[j-v[i]]+val[i];
                cheak[i][j]=1;
            }
        }
        cout<<dp[m]<<endl;
        int i=1,j=m;
        while(i<=n&&j>0)
        {
            if(cheak[i][j])
            {
                cout<<i<<" ";
                j=j-v[i];
            }
            i++;
        }
    }
}
原文地址:https://www.cnblogs.com/Leozi/p/10834966.html