📄 bag.cpp
字号:
#include <stdio.h>
void readdata();
void search(int);
void checkmax();
void printresult();
int c, n; //c: 背包容量;n:物品数
int w[100], v[100]; //w[i]、v[i]:第i件物品的重量和价值
int a[100]; //a数组存放当前解各物品选取情况
//a[i]=0表示不选第i件物品,a[i]=1表示选第i件物品
int sum_value=0;//当前总价值
int sum_weight=0;//当前总重量
int best_value=-1;//记录最大价值
int best_bag[100];//记录最优选择的包
int main()
{
readdata(); //读入数据
search(0); //递归搜索
printresult();
}
void search(int m)
{
if(m>=n)
checkmax(); //检查当前解是否是可行解,若是则把它的价值与max比较
else
{
if((sum_weight+w[m])<=c){
sum_weight+=w[m];
sum_value+=v[m];
a[m]=1; //不选第m件物品
search(m+1); //递归搜索下一件物品
sum_weight-=w[m];
sum_value-=v[m];
}
a[m]=0; //选第m件物品
search(m+1); //递归搜索下一件物品
}
}
void checkmax()
{
if(sum_value>best_value) { //价值大于max
best_value=sum_value; //替换max
for(int i=0;i<n;i++){
best_bag[i]=a[i];
}
}
}
void readdata()
{printf("输入物品数");
scanf("%d",&n);
printf("输入背包容量");
scanf("%d",&c);
printf("输入物品的重量和价值");
int i;
for(i=0;i<n;i++)
scanf("%d%d",&w[i],&v[i]); //读入第i件物品重量和价值
}
void printresult()
{
printf("选择的背包为");
for(int i=0;i<n;i++){
if(1==best_bag[i])
printf("%d ",i+1);
}
printf("\n最大价值%d",best_value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -