7/21背包存档(采药)


#include<bits/stdc++.h> using namespace std; int t,m,w[105],v[105],f[105][1005]; int main() { cin>>t>>m; for(int i=1; i<=m; i++) cin>>w[i]>>v[i]; for(int i=1; i<=m; i++) { for(int j=t; j>=0; j--) { if(j>=w[i]) f[i][j]=max(f[i-1][j-w[i]]+v[i],f[i-1][j]); else f[i][j]=f[i-1][j]; } } cout<<f[m][t]; }

背包dp

// http://www.jzoj.cn/problem.php?id=1746
// 30%
# include <bits/stdc++.h>
using namespace std;
int n,a[101];
int W,w[101],v[101],maxv;
int tw,tv;

int rest(int dep){
int s=0;
for(int i=dep;i<=n;i++) s+=v[i];
return s;
}

void dfs(int dep){
if(dep>n) //方案处理,计算这个方案的总重量和总价值
{
if(tv>maxv) maxv=tv;
}
else{
for(int i=0;i<=1;i++){
a[dep]=1-i;
if(tw+a[dep]*w[dep]<=W && tv+a[dep]*v[dep]+rest(dep+1)>maxv ){
tw+=a[dep]*w[dep];
tv+=a[dep]*v[dep];
dfs(dep+1);
tw-=a[dep]*w[dep];
tv-=a[dep]*v[dep];
}
}

}
}

int main(){
cin>>W>>n;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];

dfs(1);
cout<<maxv<<endl;
return 0 ;


}

4

posted @ 2023-07-21 09:12  竹余居居居居居  阅读(14)  评论(0)    收藏  举报