題目:購物單問題====================================================
主件 | 附件 |
電腦 | 打印機,掃描儀 |
書櫃 | 圖書 |
書桌 | 檯燈,文具 |
工作椅 | 無 |
#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個輸入的全是附件,那好像就會造成這個問題。