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
第一行不用管他