01背包之贪心选择

来源:互联网 发布:魔兽任务数据库 编辑:程序博客网 时间:2024/05/18 00:13

#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);}//按序挑选inti=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(){structNode nodes[N];//用数组初始化物品节点,背包容量为总重量的一半int v[N]={5,4,3,6,8};//价值数组int w[N]={2,1,3,2,4};//重量数组int c=0;printf("noweightvalueflagwv(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);}


0 0