0-1揹包(回溯法剪枝版)
阿新 • • 發佈:2019-01-27
#include<stdio.h>
#define n 3
int maxvalue=0,tot=0;
int w[n]={16,15,15},v[n]={45,25,25},c=30;
int tempweight=0,tempvalue=0;
void dfs(int t)
{
if(t==n)
{
if(tempvalue>maxvalue && tempweight<=c)
maxvalue=tempvalue;
return;
}
//left subtree
if(tempvalue<=c && tempvalue+tot>maxvalue)
{
tempvalue+=v[t];
tempweight+=w[t];
tot-=v[t];
dfs(t+1);
tempvalue-=v[t];
tempweight-=w[t];
tot+=v[t];
}
//right subtree
if(tempvalue+tot>maxvalue)
{
tot+=v[t];
dfs(t+1);
tot-=v[t];
}
}
int main()
{
int i;
for(i=0;i<n;i++)
{
tot+=v[i];
}
dfs(0);
printf("%d\n",maxvalue);
return 0;
}
#define n 3
int maxvalue=0,tot=0;
int w[n]={16,15,15},v[n]={45,25,25},c=30;
int tempweight=0,tempvalue=0;
void dfs(int t)
{
if(t==n)
{
if(tempvalue>maxvalue && tempweight<=c)
maxvalue=tempvalue;
return;
}
//left subtree
if(tempvalue<=c && tempvalue+tot>maxvalue)
{
tempvalue+=v[t];
tempweight+=w[t];
tot-=v[t];
dfs(t+1);
tempvalue-=v[t];
tempweight-=w[t];
tot+=v[t];
}
//right subtree
if(tempvalue+tot>maxvalue)
{
tot+=v[t];
dfs(t+1);
tot-=v[t];
}
}
int main()
{
int i;
for(i=0;i<n;i++)
{
tot+=v[i];
}
dfs(0);
printf("%d\n",maxvalue);
return 0;
}