博物馆大盗 数据结构:每个藏品封装为一个对象,对象有属性价值和重量。 动态规划:对于每个藏品,盗贼都有两种选择:偷或不偷。通过递归,可以模拟选择过程。 优化:剪枝。在选择之前,先判断如果选择之后,重量是否超出背包承重。没有超出才选。 #include<bits\stdc++.h> using namespace std; const int N = 1000; struct Good{ int w; int c; }good[N]; //藏品数、背包承重、选中藏品重量、选中藏品价值 int n,V,W = 0,C = 0; void takeGood(int k,int sumW,int sumC){ //递归出口 if(k == n || sumW == V){ return; } //不拿 takeGood(k+1,sumW,sumC); //拿 //只有拿了之后重量仍然合法,才可以拿 if(sumW + good[k].w <= V){ if(sumC + good[k].c > C){ W = sumW + good[k].w; C = sumC + good[k].c; } takeGood(k+1,sumW + good[k].w,sumC + good[k].c); } } int main(){ cin>>n>>V; for(int i=0;i<n;i++){ cin>>good[i].w>>good[i].c; } //sort(good,good+n,cmp); takeGood(0,0,0); cout<<"最大重量:"<<W<<","<<"最大价值:"<<C<<endl; return 0; }