問題陳述: 給定n種物品和一個背包.物品i的重量是Wi,其價值為Vi,背包的容量為C.在選 擇物品i裝入背包時,可以選擇物品i的一部分,1<= i <=n.問應如何選擇裝入背包 中的物品,使得裝入背包中物品的總價值最大.


貪心算法

 

#include <stdio.h>
#include<malloc.h>
#include<string.h>
#define HASH_LEN 50
#define M 47
#define NAME_NO 30

typedef struct NAME
{
char *py; //名字的拼音
int k; //拼音所對應的整數
}NAME;
NAME NameList[HASH_LEN];
typedef struct hterm //哈希表
{
char *py; //名字的拼音
int k; //拼音所對應的整數
int si; //查找長度
}HASH;

HASH HashList[HASH_LEN];
void InitNameList()
{
NameList[0].py="liujianwen";
NameList[1].py="shiyongqing";
NameList[2].py="zhongjialiang";
NameList[3].py="fenfyubao";
NameList[4].py="nonghuajian";
NameList[5].py="liaojianxin";
NameList[6].py="lianjinsong";
NameList[7].py="liuxiao";
NameList[8].py="lushaojian";
NameList[9].py="liangshiqian";
NameList[10].py="lichao";
NameList[11].py="liwei";
NameList[12].py="luojiayu";
NameList[13].py="lvjun";
NameList[14].py="liuhongxiu";
NameList[15].py="huangkeqiang";
NameList[16].py="weiyihui";
NameList[17].py="liaohaoqiang";
NameList[18].py="zhangdeshang";
NameList[19].py="zhouzihe";
NameList[20].py="chenqiuyan";
NameList[21].py="wangliecheng";
NameList[22].py="liaowei";
NameList[23].py="gongxinhua";
NameList[24].py="xiongbei";
NameList[25].py="moshaoxi";
NameList[26].py="lixiaolan";
NameList[27].py="wangjunxiu";
NameList[28].py="qinjinfeng";
NameList[29].py="zhoutong";

 


char *f;

int r,s0;


for (int i=0;i<NAME_NO;i++)// 求出各個姓名的拼音所對應的整數

{

s0=0;

f=NameList[i].py;


for (r=0;*(f+r) != '\0';r++) //方法:將字符串的各個字符所對應的ASCII碼相加,所得的整數做為哈希表的關鍵字

s0=*(f+r)+s0;


NameList[i].k=s0;

}

}

void CreateHashList()

{

for ( int i=0; i<HASH_LEN;i++)//哈希表的初始化

{

HashList[i].py="";

HashList[i].k=0;

HashList[i].si=0;

}


for ( i=0; i<NAME_NO;)

{

int sum=0;

int adr=(NameList[i].k) % M; //哈希函數

int d=adr;

if(HashList[adr].si==0) //如果不沖突

{

HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;

HashList[adr].si=1;

}

else //沖突

{

do

{

d=(d+((NameList[i].k))%10+1)%M; //偽散列

sum=sum+1; //查找次數加1

}while (HashList[d].k!=0);


HashList[d].k=NameList[i].k;

HashList[d].py=NameList[i].py;

HashList[d].si=sum+1;

}i++;

}

}


void FindList()

{

printf("\n\n請輸入姓名的拼音: "); //輸入姓名

char name[20]={0};

scanf("%s",name);


int s0=0;

for (int r=0;r<20;r++) //求出姓名的拼音所對應的整數(關鍵字)
s0+=name[r];


int sum=1;

int adr=s0 % M; //使用哈希函數

int d=adr;


if(HashList[adr].k==s0) //分3種情況進行判斷

printf("\n姓名:%s 關鍵字:%d 查找長度為: 1",HashList[d].py,s0); else if (HashList[adr].k==0)

printf("無該記錄!");

else

{

int g=0;

do

{

d=(d+s0%10+1)%M; //偽散列

sum=sum+1;

if (HashList[d].k==0)
{

printf("無記錄! ");

g=1;

}

if (HashList[d].k==s0)

{

printf("\n姓名:%s 關鍵字:%d 查找長度為:%d",HashList[d].py,s0,sum); g=1;

}

}while(g==0);

}

}


void Display()

{

printf("\n\n地址\t關鍵字\t\t搜索長度\tH(key)\t\t拼音 \n"); //顯示的格式
for(int i=0; i<15; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

for( i=15; i<30; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}


for( i=30; i<40; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}
for(i=40; i<50; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}


float average=0;

for (i=0;i<HASH_LEN;i++)

average+=HashList[i].si;

average/=NAME_NO;

printf("\n\n平均查找長度:ASL(%d)=%f \n\n",NAME_NO,average); }


int main()

{

printf("\n------------------------哈希表的建立和查找----------------------"); InitNameList();

CreateHashList ();


while(1)

{

printf("\n\n");

printf(" 1. 顯示哈希表\n");

printf(" 2. 查找\n");

printf(" 3. 退出\n");


err:

char ch1;

scanf("%c",&ch1);

if (ch1=='1')

Display();

else if (ch1=='2')

FindList();

else if (ch1=='3')

return 0;

else

{

printf("\n請輸入正確的選擇!");

goto err;

}
}

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM