1.0-1背包问题两种方法:蛮力法与回溯法有何区别?时间渐近复杂度分别分为多少?有何区别?为什么?
区别:对于0/1 选择树 回溯法会对子树进行剪枝,降低时间复杂度
时间复杂度均为 O(n)=2nO(n)=2^{n}O(n)=2n
区别:在实际运算中,数据相同时,虽然它们的时间复杂度的上界函数相同,但回溯法的时间复杂度会优于蛮力法,在最坏情况下二者时间渐进复杂度才相同。
原因:回溯法会对子树进行剪枝以降低时间复杂度。
2.解决非0-1背包问题:
typedef struct{
char name;
float v;
float w;
float key;
}goods;
int n;vector<goods> g;
float nowweight=0;
float remainweight=10;
float nowvalue=0;
vector<int> bagG;
float bestV=0;
vector<int> bestS;
float shangjie=0;
void digui(int k)
{
int i,j=0,maxG;
float shangjie=0;
if(k>n)
{
if(nowvalue> bestV)
{
for(int i=0;i<n;i++)
{
bestS[i]=bagG[i];
}
bestV=nowvalue;
}
return;
}
maxG=remainweight/g[k].w;
shangjie=nowvalue+(remainweight-nowweight)*g[k].key;
if(bestV>=shangjie)return;
for(i=maxG;i>=0;i--)
{
if(nowweight+i*g[k].w <=remainweight )
{
nowweight += i*g[k].w;
nowvalue+=i*g[k].v;
bagG[k]=i;
j=k;
if(nowweight==remainweight)
{
for(j++;j<n;j++)
{
bagG[j]=0;
}
}
digui(j+1);
nowweight