日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贪心算法问题

發(fā)布時間:2023/11/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心算法问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

7.設(shè)有n 種物品,每種物品有一個重量及一個價值。但每種物品的數(shù)量是無限的,同時有一個背包,
最大載重量為M,今從n 種物品中選取若干件(同一種物品可以多次選取),使其重量的和小于等于M,
而價值的和為最大。

?

  • <?php ?
  • /* ?
  • *7.設(shè)有n?種物品,每種物品有一個重量及一個價值。但每種物品的數(shù)量是無限的,同時有一個背包, ?
  • 最大載重量為M,今從n?種物品中選取若干件(同一種物品可以多次選取),使其重量的和小于等于M, ?
  • 而價值的和為最大。 ?
  • *系統(tǒng)環(huán)境:windows/linux ?
  • *編譯環(huán)境:php4/php5 ?
  • *輸入?yún)?shù):存放在in.txt,多個參數(shù)時空格分隔 ?
  • ????????????????????參數(shù)1是一組數(shù)字,表示一組物品的重量和價值,中間用分號分割,每個物品重量和價值之間用逗號分隔; ?
  • ????????????????????重量,單位為千克,不能有0,物品的價值,個數(shù)必須和重量一樣 ?
  • ????????????????????參數(shù)3是一個數(shù)字,表示最大重量,單位為千克, ?
  • ????????????????????例如格式:1,1;3,4;2,4;3,7;9,8?10 ?
  • ????輸出:out.txt ?
  • ?
  • */?
  • $params=getParams(2); ?
  • $argv0=trim(trim($params[0]),";"); ?
  • $argv1=trim($params[1]); ?
  • //檢查參數(shù)1 ?
  • if(!preg_match_all("/^((\d+,\d+);?)+$/i",?$argv0,$matches)) ?
  • { ?
  • ????error_msg("params?1?must?is?group?of?numbers,break?with?;?and?,"); ?
  • } ?
  • //檢查參數(shù)2 ?
  • if(!is_numeric($argv1)) ?
  • { ?
  • ????error_msg("params?3?must?be?a?numbers"); ?
  • } ?
  • $weights=array(); ?
  • $values=array(); ?
  • $a=split(";",trim($argv0,?";")); ?
  • foreach($a?as?$s) ?
  • { ?
  • ????$b=split(",",trim($s,?",")); ?
  • ????$weights[]=$b[0]; ?
  • ????$values[]=$b[1]; ?
  • } ?
  • ?
  • ?
  • if(count($weights)!=count($values)) ?
  • { ?
  • ????error_msg("weights?count?must?equal?values?count"); ?
  • } ?
  • $max_weight=$argv1; ?
  • //要在max_weight限制下獲取到最大的價值的話,需要計算出每一千克的價值,然后按照從大到小排列 ?
  • $value_per_weights=array(); ?
  • foreach($weights?as?$i?=>?$weight) ?
  • { ?
  • ????if($weight==0) ?
  • ????{ ?
  • ????????error_msg("weight?must?>?0");??? ?
  • ????} ?
  • ????$value_per_weights[$i]=$values[$i]/$weight; ?
  • } ?
  • //其中先按照每一千克的價值從大到小排序,重量按照從小到大排序,價值從大到小排序,物品序號不排序 ?
  • $ar?=?array?($value_per_weights,?$weights,$values,array_keys($values)); ?
  • array_multisort?($ar[0],SORT_NUMERIC,?SORT_DESC, ?
  • ?????????????????$ar[1],?SORT_NUMERIC,?SORT_ASC, ?
  • ?????????????????$ar[2],?SORT_NUMERIC,?SORT_DESC,$ar[3]); ?
  • ?
  • $weights_order=$ar[1]; ?
  • $values_order=$ar[2]; ?
  • $index_order=$ar[3]; ?
  • $now_weight=0; ?
  • $i=0; ?
  • $total=count($weights_order); ?
  • $max_value=0; ?
  • $find=array(); ?
  • while(1) ?
  • { ?
  • ????if($now_weight+$weights_order[$i]?<=?$max_weight) ?
  • ????{ ?
  • ????????$now_weight+=$weights_order[$i]; ?
  • ????????$max_value+=$values_order[$i]; ?
  • ???????? ?
  • ????????//統(tǒng)計物品i的個數(shù) ?
  • ????????if(isset($find[$index_order[$i]])) ?
  • ????????{ ?
  • ????????????$find[$index_order[$i]]++; ?
  • ????????}else?
  • ????????{ ?
  • ????????????$find[$index_order[$i]]=1;?? ?
  • ????????} ?
  • ????????if($now_weight==$max_weight) ?
  • ????????{ ?
  • ????????????break;?? ?
  • ????????} ?
  • ????}else{ ?
  • ????????$i++; ?
  • ????????if($i?>=?$total) ?
  • ????????{ ?
  • ????????????break;?? ?
  • ????????} ?
  • ????} ?
  • } ?
  • //清空out.txt ?
  • output("",true); ?
  • if(count($find)==0) ?
  • { ?
  • ????output("max?weight?too?small",true); ?
  • ????error_msg("execute?success"); ?
  • } ?
  • //輸出結(jié)果 ?
  • output("weight:$now_weight;max?value:$max_value"); ?
  • foreach($find?as?$index?=>?$num) ?
  • { ?
  • ????output("物品?$index(".$weights[$index].",".$values[$index].")?的個數(shù):$num"); ?
  • } ?
  • error_msg("execute?success"); ?
  • ?
  • /* ?
  • ????從in.txt里讀取參數(shù) ?
  • ???? ?
  • */?
  • function?getParams($paramNum) ?
  • { ?
  • ????$in=file_get_contents("in.txt"); ?
  • ????if($in===FALSE){ ?
  • ????????error_msg("cannot?read?in.txt,please?check?in.txt?exists\n");??? ?
  • ????} ?
  • ????$in=preg_replace("/(\s+)/i",?"?",?$in); ?
  • ????//多個參數(shù)時,按照空格分隔 ?
  • ????$parms=split("?",trim($in)); ?
  • ????if($parms===FALSE) ?
  • ????{ ?
  • ????????error_msg("cannot?get?param?from?in.txt\n"); ?
  • ????} ?
  • ????if(count($parms)?<?$paramNum) ?
  • ????{ ?
  • ????????error_msg("it?needs?$paramNum?params\n"); ?
  • ????} ?
  • ????return?$parms; ?
  • } ?
  • ?
  • /* ?
  • ????把結(jié)果輸出到輸出文件里 ?
  • ????當(dāng)isClean=true時清空out.txt ?
  • */?
  • function?output($msg,$isClean=false) ?
  • { ?
  • ????if($isClean) ?
  • ????{ ?
  • ????$handle?=?fopen('out.txt',?'w'); ?
  • ????fclose($handle);???? ?
  • ????} ?
  • ????error_log($msg."\n",?3,?"out.txt"); ?
  • } ?
  • /* ?
  • ????輸入錯誤信息 ?
  • ????如果$is_exit表示輸入信息后退出 ?
  • */?
  • function?error_msg($msg,$is_exit=true) ?
  • { ?
  • ????if($is_exit) ?
  • ????????die($msg."\n"); ?
  • ????else?
  • ????????echo?$msg."\n"; ?
  • } ?
  • ?>?
  • ?

    轉(zhuǎn)載于:https://blog.51cto.com/yifangyou/618826

    總結(jié)

    以上是生活随笔為你收集整理的贪心算法问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。