洛谷p1064金明的預算方案

原題

如果不考慮附件,就是一道01揹包題。

所以我們就先不考慮附件,把它當作01揹包做一下;因爲最多隻有兩個附件,每個物品的狀態只有三種(沒,有一個,兩個),分別當作01揹包做一下,即分爲4個01揹包。然後比較四個揹包總的最大值。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct po{
    int data,one,two,impor,ju;
}a[61];
int n,m;int f[4][3201][61];
int main()
{
    cin>>n>>m;n/=10;memset(f,0,sizeof(f));
    for(int i=1;i<=m;++i)
    {
        a[i].one=0;
        a[i].two=0;
    }
    for(int i=1;i<=m;++i)
    {
        cin>>a[i].data>>a[i].impor>>a[i].ju;
        a[i].data/=10;
        if(a[i].ju!=0)
        {
            if(a[a[i].ju].one==0)
            a[a[i].ju].one=i;
            else a[a[i].ju].two=i;
            a[i].ju=-1;
        }
    }
    for(int j=1;j<=m;++j)
    {
        for(int i=n;i>=1;--i)
        {    
            f[0][i][j]=f[0][i][j-1];
            if(i<a[j].data||a[j].ju!=0) continue;
            f[0][i][j]=max(f[0][i][j],f[0][i-a[j].data][j-1]+a[j].data*a[j].impor);
        }
    }
    for(int j=1;j<=m;++j)
    {
        for(int i=n;i>=1;--i)
        {    
            f[1][i][j]=f[1][i][j-1];
            if(i<a[j].data||a[j].ju!=0) continue;
            f[1][i][j]=max(f[1][i][j],f[1][i-a[j].data][j-1]+a[j].data*a[j].impor);
            if(i>=a[j].data+a[a[j].one].data)
            f[1][i][j]=max(f[1][i][j],f[1][i-a[j].data-a[a[j].one].data][j-1]+a[j].data*a[j].impor+a[a[j].one].data*a[a[j].one].impor);
        }
    }
    for(int j=1;j<=m;++j)
    {
        for(int i=n;i>=1;--i)
        {    
            f[2][i][j]=f[2][i][j-1];
            if(i<a[j].data||a[j].ju!=0) continue;
            f[2][i][j]=max(f[2][i][j],f[2][i-a[j].data][j-1]+a[j].data*a[j].impor);
            if(i>=a[j].data+a[a[j].two].data)
            f[2][i][j]=max(f[2][i][j],f[2][i-a[j].data-a[a[j].two].data][j-1]+a[j].data*a[j].impor+a[a[j].two].data*a[a[j].two].impor);
        }
    }
    for(int j=1;j<=m;++j)
    {
        for(int i=n;i>=1;--i)
        {    
            f[3][i][j]=f[3][i][j-1];
            if(i<a[j].data||a[j].ju!=0) continue;
            f[3][i][j]=max(f[3][i][j],f[3][i-a[j].data][j-1]+a[j].data*a[j].impor);
            if(i>=a[j].data+a[a[j].two].data+a[a[j].one].data)
            f[3][i][j]=max(f[3][i][j],f[3][i-a[j].data-a[a[j].two].data-a[a[j].one].data][j-1]+a[j].data*a[j].impor+a[a[j].two].data*a[a[j].two].impor+a[a[j].one].data*a[a[j].one].impor);
        }
    }
    int k1=max(f[0][n][m],f[1][n][m]);
    int k2=max(f[2][n][m],f[3][n][m]);
    cout<<max(k1,k2)*10;
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章