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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值