题目:购物单问题====================================================
主件 | 附件 |
电脑 | 打印机,扫描仪 |
书柜 | 图书 |
书桌 | 台灯,文具 |
工作椅 | 无 |
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int main(){
int v[61]; //每件物品的价格
int vp[61]; //每件物品的价格和重要度的乘积
int q[61]; //所属附件
int dp[61][32001];
int N;
int m;
while(cin>>N>>m){
for(int i=0;i<61;i++){
memset(dp[i],0,sizeof(dp[i]));
}
int impor;
for(int i=1;i<=m;i++){
cin>>v[i]>>impor>>q[i];
vp[i]=v[i]*impor;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=N;j++){
if(q[i]==0){
if(v[i]<=j){
dp[i][j]=max(dp[i-1][j-v[i]]+vp[i],dp[i-1][j]);
}
}
else{
if(v[i]+v[q[i]]<=j){
dp[i][j]=max(dp[i-1][j-v[i]]+vp[i],dp[i-1][j]);
}
}
}
}
cout<<dp[m][N]<<endl;
}
return 0;
}
这里有个小疑问: 这样会不会造成全部选的都是附件,因为程序并没有在选附件的条件下先选主件,而只是判断(附件+主件的重量)<j。 除非输入的顺序是先输入主件,属于这个主件的附件在这个主件后输入。如果输入顺序是随意的,比如过前10个输入的全是附件,那好像就会造成这个问题。