有一个粗心的贼带着一个破背包去偷东西,当他按照一定的顺序往包里装东西时,每往包里装3件物品,就会有一个重量最大的物品从包里掉出来,如果有两个重量相同的物品,则先装进去的会先掉出来。背包有一个最大容量,当下一件物品的重量小于当前背包剩余容量,或没有物品可以继续装入时,则他停止偷东西。
每件物品的价值不同,现在给你一个他偷东西的顺序,求他能偷到的最终价值。
例如背包容量为10,有7个物品,重量和价值如下表:
物品编号 | 重量 | 价值 |
---|---|---|
1 | 2 | 3 |
2 | 3 | 4 |
3 | 4 | 5 |
4 | 1 | 7 |
5 | 1 | 7 |
6 | 3 | 6 |
7 | 4 | 8 |
按7,6,2,5,1,4,3的顺序装入背包,则装入物品的情况如下表:
装入物品件数 | 包内物品 | 剩余容量 | 总价值 | 备注 |
---|---|---|---|---|
1 | 7 | 6 | 8 | |
2 | 7,6 | 3 | 14 | |
3 | 7,6,2 | 0 | 18 | |
3 | 6,2 | 4 | 10 | 7掉出 |
4 | 6,2,5 | 3 | 17 | |
5 | 6,2,5,1 | 1 | 20 | |
6 | 6,2,5,1,4 | 0 | 27 | |
6 | 2,5,1,4 | 3 | 21 | 6掉出 |
6 | 2,5,1,4 | 3 | 21 | 因3容量大于剩余容量,未装入,装包结束 |
本题中出现的所有数值均为整型。
输入格式:
第一行输入两个值,分别为背包的容量V(小于10000)和物品的总数N(1000)。
接下来的N行输入两个值,分别为物品重量wi和物品价值vi。
接下来的一行的第一个数输入贼偷东西的总件数,后面输入贼装东西的顺序(用1-N表示,分别对应前N行物品),同一个物品不会重复出现。
输出格式:
输出贼最终偷到的物品总价值。
输入样例:
在这里给出一组输入。例如:
10 7
2 3
3 4
4 5
1 7
1 7
3 6
4 8
7 7 6 2 5 1 4 3
输出样例:
在这里给出相应的输出。例如:
21
C++代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int V,N,i,j;
cin >>V >>N;
int height[N+1],value[N+1];
for(i=1;i<=N;i++){
cin >> height[i] >> value[i];
}
int n,k,c[N+1],num;
int count=0;
int cl=0;//价值
cin >> n;
while(n--){
cin >> k;
if(V==0||V<height[k])break;
c[count++]=k;
cl += value[k];
V-= height[k];
if(count!=0&&count%3==0){
for(j=1,num=0;j<count;j++){
if(c[j]!=-1)if(height[c[num]]<height[c[j]])num=j;
}
cl -=value[c[num]];
V +=height[c[num]];
c[num]=-1;
}
}
cout << cl;
}