强行180行AC

1 条评论

  • @ 2016-02-22 14:08:39

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int n,m,k,dp[65][32005],s[65],w[65][3],v[65][3];
    int max(int a,int b)
    {
    if(a>=b)
    return a;
    else
    return b;
    }
    int main()
    {
    scanf("%d%d",&n,&m);
    int u,p,q;
    for(int i=1;i<=m;i++)
    {
    scanf("%d%d%d",&u,&p,&q);
    if(q==0)
    {
    k++;
    v[k][q]=u;
    w[k][q]=p;
    s[k]=i;
    }
    else
    {
    for(int j=1;j<=k;j++)
    {
    if(s[j]==q)
    {
    if(v[j][1]==0)
    {
    v[j][1]=u;
    w[j][1]=p;
    }
    else
    {
    v[j][2]=u;
    w[j][2]=p;
    }
    }
    }
    }
    }
    /*
    for(int i=1;i<=k;i++)
    {
    cout<<"#"<<i<<endl;
    printf("%d %d %d\n",v[i][0],v[i][1],v[i][2]);
    printf("%d %d %d\n",w[i][0],w[i][1],w[i][2]);
    }
    */
    for(int i=1;i<=k;i++)
    {
    for(int j=0;j<=n;j++)
    {
    dp[i][j]=dp[i-1][j];
    if(j>=v[i][0])
    dp[i][j]=max(dp[i][j],dp[i-1][j-v[i][0]]+v[i][0]*w[i][0]);
    if(j>=v[i][0]+v[i][1])
    dp[i][j]=max(dp[i][j],dp[i-1][j-v[i][0]-v[i][1]]+v[i][0]*w[i][0]+v[i][1]*w[i][1]);
    if(j>=v[i][0]+v[i][2])
    dp[i][j]=max(dp[i][j],dp[i-1][j-v[i][0]-v[i][2]]+v[i][0]*w[i][0]+v[i][2]*w[i][2]);
    if(j>=v[i][0]+v[i][1]+v[i][2])
    dp[i][j]=max(dp[i][j],dp[i-1][j-v[i][0]-v[i][1]-v[i][2]]+v[i][0]*w[i][0]+v[i][1]*w[i][1]+v[i][2]*w[i][2]);
    }
    }
    printf("%d\n",dp[k][n]);
    return 0;
    }

  • 1

信息

ID
1313
难度
6
分类
动态规划 | 背包 点击显示
标签
递交数
8330
已通过
2465
通过率
30%
被复制
21
上传者