C++背包问题.
答案:3 悬赏:20 手机版
解决时间 2021-11-16 09:31
- 提问者网友:蓝莓格格巫
- 2021-11-16 00:10
C++背包问题.
最佳答案
- 五星知识达人网友:摆渡翁
- 2021-11-16 00:42
//动态规划解礼物分配问题
#include
#include
#define N 11
#define M 51
int main()
{
int i,j,n,m,sum=0,v[N],c[N][M];
cout<<"输入礼物个数:";
cin>>n;
v[0]=0;
cout<<"输入礼物价值\n";
for(i=1;i<=n;i++){
cin>>v[i];
sum=sum+v[i];
}
m=sum/2;
for (i=0;i<=n;i++)//初始化
for (j=0;j<=m;j++)
c[i][j]=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (v[i]<=j){
if (v[i]+c[i-1][j-v[i]]>c[i-1][j])
c[i][j]=v[i]+c[i-1][j-v[i]];//选择第i物品
else
c[i][j]=c[i-1][j];//不选择第i个物品
}
else
c[i][j]=c[i-1][j];//剩余容量不够
int temp=m;
int x[N]={0,0,0,0,0,0,0,0,0,0,0};
for (i=n;i>0;i--)
if (c[i][temp]==c[i-1][temp])//最后一个肯定是最大价值的
x[i]=0;
else
{
x[i]=1;
temp-=v[i];
}
cout<<"\nBob的礼物\t礼物序号: ";
for (i=0;i<=n;i++)
if (x[i])
cout< cout<<"\n\t\t总价值:"< cout<<"\nAlen的礼物\t礼物序号: ";
for(i=0;i<=n;i++)
if(!x[i] && i)
cout< cout<<"\n\t\t总价值:"< getch();
return 0;
}
要详细的文档请留邮箱
#include
#include
#define N 11
#define M 51
int main()
{
int i,j,n,m,sum=0,v[N],c[N][M];
cout<<"输入礼物个数:";
cin>>n;
v[0]=0;
cout<<"输入礼物价值\n";
for(i=1;i<=n;i++){
cin>>v[i];
sum=sum+v[i];
}
m=sum/2;
for (i=0;i<=n;i++)//初始化
for (j=0;j<=m;j++)
c[i][j]=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (v[i]<=j){
if (v[i]+c[i-1][j-v[i]]>c[i-1][j])
c[i][j]=v[i]+c[i-1][j-v[i]];//选择第i物品
else
c[i][j]=c[i-1][j];//不选择第i个物品
}
else
c[i][j]=c[i-1][j];//剩余容量不够
int temp=m;
int x[N]={0,0,0,0,0,0,0,0,0,0,0};
for (i=n;i>0;i--)
if (c[i][temp]==c[i-1][temp])//最后一个肯定是最大价值的
x[i]=0;
else
{
x[i]=1;
temp-=v[i];
}
cout<<"\nBob的礼物\t礼物序号: ";
for (i=0;i<=n;i++)
if (x[i])
cout< cout<<"\n\t\t总价值:"<
for(i=0;i<=n;i++)
if(!x[i] && i)
cout< cout<<"\n\t\t总价值:"<
return 0;
}
要详细的文档请留邮箱
全部回答
- 1楼网友:痴妹与他
- 2021-11-16 01:27
不懂你在说什么、
- 2楼网友:一袍清酒付
- 2021-11-16 01:08
你指的是普通背包问题(物品可以拆卸)还是0/1背包问题啊?
如果是普通背包问题的话,遵循单价最优原则就好了。
如果是0/1背包问题采取动态规划。
如果是普通背包问题的话,遵循单价最优原则就好了。
如果是0/1背包问题采取动态规划。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯