1、0-1背包问题
有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。要求每个物品要么放进背包,要么不放进背包。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int dp[N];
typedef struct
{
int w,val;
}stu ;
stu p[N];
int n,v,ans;
void dfs(int x,int ew,int eval) // 当第x件未装时, ew 消耗的容量 ,eval 和已有的价值
{
ans=max(ans,eval);
if(x>n)
{
return ;
}
int nw,nval; // 新的重量 与价值
nw=ew+p[x].w;
nval=eval+p[x].val;
if(nw<=v)
{
dfs(x+1,nw,nval); // 选第x 件物品
}
dfs(x+1,ew,eval); // 不选第 x 件物品
}
int main()
{
cin>>n>>v;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&p[i].w,&p[i].val);
}
ans=0;
dfs(1,0,0);
printf("%d\n",ans);
return 0;
}
虽然 课设01背包 要求用回溯法, 但01背包时 动态规划的模板题
提供一道例题 :poj 3624 Charm Bracelet
#include <iostream>
#include<algorithm>