P1064 【金明的预算方案】

有一种能力叫

“样例WA了也能AC”

这道题最难之处就在于对于主件附件的考虑;

要我来说,只需要把附件记上主件就行了

下面献上本蒟蒻的的代码

注:

这里面有WA样例的代码,但并不影响最后的评测!!!

代码来啦!

#include <cstdio>
#include <iostream>//max的头文件
using namespace std;
//a代表是主件还是附件,b代表某个主件所拥有的附件号码,c是价格*重要度,d是价格
int a[100],b[100][3],c[100],d[100],f[32010];
int main(){
    int m,n,x,y,z;//m是个数,n是总钱数
    scanf("%d%d",&n,&m);//输入
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);//x是价格,y是重要度,z是是否是主件
        c[i]=x*y;
        d[i]=x;
        //存入
        if(!z)a[i]=1;//主件存入1
        else{
            b[z][0]++;//记录附件个数
            b[z][b[z][0]]=i;//记录附件编号
        }
    }
    for(int i=1;i<=m;i++){
        if(a[i]){
            for(int j=n;j>=d[i];j--){
                f[j]=max(f[j],f[j-d[i]]+c[i]);//最普通的递推解析式
                if(b[i][0]>0&&j-d[i]-d[b[i][1]]>=0)f[j]=max(f[j],f[j-d[i]-d[b[i][1]]]+c[i]+c[b[i][1]]);
                if(b[i][0]==2){
                    if(j-d[i]-d[b[i][2]]>=0)f[j]=max(f[j],f[j-d[i]-d[b[i][2]]]+c[i]+c[b[i][2]]);
                    if(j-d[i]-d[b[i][1]]-d[b[i][2]]>=0)f[j]=max(f[j],f[j-d[i]-d[b[i][2]]-d[b[i][1]]]+c[i]+c[b[i][2]]+c[b[i][1]]);
                    //有附件的递推解析式
                }
            }
        }
    }
    while(!a[n])n--;//WA样例的代码(去掉)
    printf("%d",f[n]);//输出
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42926515/article/details/82936703