正文

Enigma(f)2005-09-04 16:56:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/elva6401/4433.html

分享到:

#include<iostream.h>
#include<fstream.h>
//#include<math.h>

int m[21][51],w[21],v[21],flag[21];

int min(int a,int b)
{
    if(a>b)
        return b;
    else
        return a;
}

int max(int a,int b)
{
    if(b>a)
        return b;
    else
        return a;
}
void knapsack(int n,int c)
{
    int i,j;
//    int k=n-1;
    int jMax=min(w[n]-1,c);//jMax表示第N个物品不能装入的最大容积
    for(i=0;i<=jMax;i++)
        {
        m[n][i]=0;
        }
    for(i=w[n];i<=c;i++)
        {
        m[n][i]=v[n];
        }
    for(i=n-1;i>1;i--)
        {
        jMax=min(w[i]-1,c);
        for(j=0;j<=jMax;j++)
            m[i][j]=m[i+1][j];
        for(j=w[i];j<=c;j++)
            m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
        }
    m[1][c]=m[2][c];
    if(c>=w[1])
        m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
}

void trackback(int n,int c)
{
    int i;
    for(i=1;i<n;i++)
        if(m[i][c]==m[i+1][c])
            flag[i]=0;
        else
            {
            flag[i]=1;
            c-=w[i];
            }    
        flag[n]=(m[n][c]>0)?1:0;
}
int main()
{    
    ifstream fin("F.in");
    ofstream fout("F.out");
    int n,c,i;
    while(fin>>n>>c)
        {
        for(i=1;i<=n;i++)
            {
            fin>>w[i]>>v[i];
            }
        knapsack(n,c);
        trackback(n,c);
        fout<<m[1][c]<<endl;
        fout<<"{";
        for(i=1;i<=n;i++)
            {
            if(i!=1)
                fout<<",";
            fout<<flag[i];
            }
        fout<<"}"<<endl;
        }
    fin.close();
    fout.close();
    return 0;
}

阅读(4434) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册