📄 0-1
字号:
#include<iostream.h>
int c; //背包容量
int n; //物品数
int *w; //物品重量
int *p; //物品价值
int cw; //当前重量
int cp; //当前价值
int *choose; //当前装载情况
int bestp; //最优价值
int *bestc; //最优装载情况
//回溯
void backtrack(int t)
{
int i,j;
if(t>n)
{
for(i=1;i<=n;i++)
{
cout<<choose[i]<<" ";
}
cout<<cw<<" ";
cout<<cp<<endl;
if(cp>bestp)
{
bestp=cp;
for(j=1;j<=n;j++)
{
bestc[j]=choose[j];
}
}
}
else
{
for(i=0;i<=1;i++)
{
if(i==0)
{
choose[t]=0;
backtrack(t+1);
}
if(i==1 && cw+w[t]<=c)
{
cw+=w[t];
cp+=p[t];
choose[t]=1;
backtrack(t+1);
}
}
}
cw-=w[t-1]*choose[t-1];
cp-=p[t-1]*choose[t-1];
}
//贪心,不能解决的问题
void greedy()
{
int index=1,max=0;
int *temp;
temp=new int[n+1];
for(int i=1;i<=n;i++)
{
choose[i]=0;
cw=0;
cp=0;
}
for(int j=1;j<=n;j++)
{
for(i=1;i<=n;i++)
{
if(((float)p[j]/w[j])<((float)p[i]/w[i]))
{
index++;
}
}
temp[j]=index;
index=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(temp[j]==i)
{
if(w[j]<c)
{
choose[j]=1;
c-=w[j];
cw+=w[j];
cp+=p[j];
}
}
}
}
bestp=cp;
for(i=1;i<=n;i++)
{
bestc[i]=choose[i];
}
}
int main()
{
int i;
cout<<"输入背包容量:";
cin>>c;
cout<<"输入物品数:";
cin>>n;
w=new int[n+1];
p=new int[n+1];
choose=new int[n+1];
bestc=new int[n+1];
cout<<"输入各物品重量:";
for(i=1;i<=n;i++)
{
cin>>w[i];
}
cout<<"输入各物品价值:";
for(i=1;i<=n;i++)
{
cin>>p[i];
}
bestp=0;
cw=0;
cp=0;
backtrack(1);
cout<<"最优装载:"<<endl;
for(i=1;i<=n;i++)
{
cout<<bestc[i]<<" ";
}
cout<<bestp<<endl;
return 0;
}
输入背包容量:7
输入物品数:4
输入各物品重量:3 5 2 1
输入各物品价值:9 10 7 4
0 0 0 0 0 0
0 0 0 1 1 4
0 0 1 0 2 7
0 0 1 1 3 11
0 1 0 0 5 10
0 1 0 1 6 14
0 1 1 0 7 17
1 0 0 0 3 9
1 0 0 1 4 13
1 0 1 0 5 16
1 0 1 1 6 20
最优装载:
1 0 1 1 20
输入背包容量:10
输入物品数:5
输入各物品重量:2 2 6 5 4
输入各物品价值:6 3 5 4 6
0 0 0 0 0 0 0
0 0 0 0 1 4 6
0 0 0 1 0 5 4
0 0 0 1 1 9 10
0 0 1 0 0 6 5
0 0 1 0 1 10 11
0 1 0 0 0 2 3
0 1 0 0 1 6 9
0 1 0 1 0 7 7
0 1 1 0 0 8 8
1 0 0 0 0 2 6
1 0 0 0 1 6 12
1 0 0 1 0 7 10
1 0 1 0 0 8 11
1 1 0 0 0 4 9
1 1 0 0 1 8 15
1 1 0 1 0 9 13
1 1 1 0 0 10 14
最优装载:
1 1 0 0 1 15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -