0分求不嫌麻烦的大神帮忙看一下

P1064 [NOIP2006 提高组] 金明的预算方案

Nibelungen @ 2017-06-14 16:36:46

//状态转移方程d(i)=max{d(i-sub[i])*price 
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string.h>
using namespace std;
int ans[1000],mon,sup,sub[60],imp[60],price[60],mark[60];
int dp(int i){
    if(ans[i]>0)return ans[i];                   //记忆,判重 
    for(int a=1;a<=sup;a++){                     //尝试所有情况 
    if(!mark[a]&&(!sub[a]||!mark[sub[a]])){
    mark[a]+=1;
    int sum=price[a]*imp[a];                     //确保这个物品没有买,若为附件主件已买 
    ans[i]=ans[i]+max(dp(i-price[a])+sum,ans[i]);
    }
    mark[a]-=1; 
    }
    return ans[i];
}
int main(){
    scanf("%d%d",&price,&sup);
    for(int a=1;a<=sup;a++){
        int v,p,q;
        scanf("%d%d%d",&price[a],&imp[a],&sub[a]);//物品价格,物品重要程度,物品属性(主件/附件) 
    }
memset(mark,0,sizeof(mark));
memset(ans,0,sizeof(ans)); 
printf("%d",dp(sup));    
}

by Nibelungen @ 2017-06-14 16:37:09

第一行不用管他


|