http://acm.zua.edu.cn/problem.php?cid=1025&pid=24
解题思路:
物体的个数为Num,背包的体积限制为Volum
物品的体积是v[1]、v[2]、...、v[Num]
物品的价值是w[1]、w[2]、...w[3]
找出一个物品的组合,使得在不超过体积Volum的条件下,价值最大。
用回溯法
Num个物品分别编号1、2、...、Num
对每个物品都有取或者不取两种情况。
int Max;//最大价值
int Volum;//背包容量
int Num;//物品总数量
void f3(int i,int doneVol,int doneVal)
{//递归算法,01背包,效率低
//已经从第1个物品试探而来,该试探第i个物品了
//donVol是已选物品总体积,doneVal是已选物品总价值
if(doneVal>Max) Max=doneVal;//保持Max存当前最大值价值
if(i>Num) return;//全部物品试探完毕
if(doneVol+v[i].vol<=Volum)//如果加入第i个物品不超最大体积,则试探加入,再试探第i+1个
f3(i+1,doneVol+v[i].vol,doneVal+v[i].val);
f3(i+1,doneVol,doneVal);//不选第i个物品
}
全部代码如下:
#include <stdio.h>
#include <string.h>
#include<vector>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
int val;
int vol;
};
node v[1001];
int Max;
int Volum;
int Num;
int i,j;
void f3(int i,int doneVol,int doneVal)
{//递归算法,01背包,效率低
if(doneVal>Max) Max=doneVal;
if(i>Num) return;
if(doneVol+v[i].vol<=Volum)
f3(i+1,doneVol+v[i].vol,doneVal+v[i].val);
f3(i+1,doneVol,doneVal);
}
struct tnode
{
int cur,doneVol,doneVal;
};
int main(void)
{
int t;
cin>>t;
while(t--)
{
cin>>Num>>Volum;
int tVol=0,tVal=0;
for(i=1;i<=Num;i++)
{
cin>>v[i].val;
tVal+=v[i].val;
}
for(i=1;i<=Num;i++)
{
cin>>v[i].vol;
tVol+=v[i].vol;
}
Max=0;
f3(1,0,0) ;
cout<<Max<<"\n";
}
return 0;
}
对于小规模数据,能解决问题。
将其思路应用到大型数据问题,不work。
比如对于下面的题目是失败的。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602