PTA7-2 0-1背包 (50 分) 回溯法
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA7-2 0-1背包 (50 分) 回溯法相关的知识,希望对你有一定的参考价值。
输入:
5 10
2 6
2 3
6 5
5 4
4 6
输出:
15
重要的是剪枝。
感谢x同学。
上界是给“不拿”用的。
如果不拿的再加上上界的值小于当前最优值,就return。(没有搞头了)
#include<bits/stdc++.h>
using namespace std;
struct node
int w,v;
double dj;
a[105];
int n,c;
bool cmp1(node a,node b)//dfs 用
if(a.v!=b.v) return a.v>b.v;
else return a.w<b.w;
bool cmp2(node a,node b)//bound 用
return a.dj>b.dj;
int bound(int u,int cc)//返回第u个物品 剩cc容量 的上界
node b[105];
int j=0;
for(int i=u;i<=n;i++)
b[j++]=a[i];
sort(b,b+j,cmp2);
int anss=0;
for(int i=0;i<j;i++)
if(cc>=b[i].w)
anss+=b[i].v;
cc-=b[i].w;
else
anss+=(b[i].dj*cc);
cc=0;break;
return anss;
int ans=-1;
void dfs(int u,int sum,int cc)//第u个物品 v之和 c容量剩余
if(u>n) ans=max(ans,sum);
else
//拿
if(cc-a[u].w>=0) dfs(u+1,sum+a[u].v,cc-a[u].w);
//不拿
int bou=bound(u,cc);
if(bou+sum>ans) dfs(u+1,sum,cc);
int main()
cin>>n>>c;
for(int i=1;i<=n;i++)
int w,v; double dj;
cin>>w>>v;
dj=v*1.0/w;
a[i]=w,v,dj;
dfs(1,0,c);
cout<<ans;
return 0;
以上是关于PTA7-2 0-1背包 (50 分) 回溯法的主要内容,如果未能解决你的问题,请参考以下文章