#include <stdio.h>
#include <stdlib.h>
#define random(x) (rand()%x)+1 //产生随机数 (0,100]
#define N 5 //物品规模
#define C 60 //背包容量
int x[N]; //解向量
//背包节点
struct Node{
float wv; //单位重量的价值
int weight; //重量
int value; //价值
bool flag; //0表示不装入背包, 1表示装入书包
int no; //编号 [0,+]
};
//按序排序函数
int compare(const void *a,const void *b){
return *(float *)a < *(float *)b ? 1 : -1;
}
//贪心算法
void greedy01(Node nodes[],int n,int c){
//按照wv排序
qsort(nodes,n,sizeof(nodes[0]),compare);
//查看排序后
printf("(greedy algorithm)按照wv排序后:\n");
for(int i=0;i<n;i++){
printf("%d %d %d %d %f\n",nodes[i].no,nodes[i].weight,nodes[i].value,nodes[i].flag,nodes[i].wv);
}
//按序挑选
int i=0;
while(c>nodes[i].weight){
nodes[i].flag=1; //物品的状态设置为装入背包
x[nodes[i].no]=1; //修改解向量
c=c-nodes[i].weight; //容量减小
i++;
}
}
//输出解向量
void printx(int x[],int n){
printf("解向量x={");
for(int i=0;i<n-1;i++){
printf("%d,",x[i]);
}
printf("%d}\n",x[n-1]);
}
void main(){
struct Node nodes[N];
//用数组初始化物品节点,背包容量为总重量的一半
int v[N]={5,4,3,6,8}; //价值数组
int w[N]={2,1,3,2,4}; //重量数组
int c=0;
printf("no weight value flag wv (init)\n");
int i;
for(i=0;i<N;i++){
nodes[i].no=i;
nodes[i].weight=w[i];
nodes[i].value=v[i];
nodes[i].flag=0;
nodes[i].wv=(float)nodes[i].value/nodes[i].weight;
printf("%d %d %d %d %f\n",nodes[i].no,nodes[i].weight,nodes[i].value,nodes[i].flag,nodes[i].wv);
c=c+w[i];
}
c=c/2;
printf("%d\n",c);
greedy01(nodes,N,c);
printx(x,N);
}
01背包之贪心选择
最新推荐文章于 2021-01-29 04:42:34 发布