python 贪心算法 0-1背包问题

给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。
应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

输入格式:
共有n+1行输入:
第一行为n值和c值,表示n件物品和背包容量c;
接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。

输出格式:
输出装入背包中物品的最大总价值。

输入样例:
在这里给出一组输入。例如:

5 10
2 6
2 3
6 5
5 4
4 6
输出样例:
在这里给出相应的输出。例如:

15


N, V = map(int, input().split())
 
dp = [0] * (V+1)
for _ in range(N):
    v, w = map(int, input().split())
    for j in range(V, v-1, -1):
        dp[j] = max(dp[j], dp[j-v]+w)
print(dp[-1])
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

可以做个参考,感觉我这个是最笨的方法。用php写的,输入的没加。

<?php


/* 
 * $arr 每个物品重量如
 * 
 *
 */
$n=5;
$c=10;//背包总量
//$a<=100;//每个物品重量
//$b<=100;//每个物品价格
//$c<=1000;
$yz=[[2,6],[2,3],[6,5],[5,4],[4,6]];//已知物品重量对应单价数组【重量,总价值】
$r=get_max_jz($n,$yz,$c);
print_r($r);
function get_max_jz($n,$yz,$c){
    if($n>100){
        return '物品种类不能超出100';
    }
    if($c>1000){
        return '背包容纳不能超出1000';
    }
    foreach($yz as $k=>$v){
        if($v[0]>100){
            return '每个物品重量不能超出100';
        }
        if($v[1]>100){
            return '每个物品价值不能超出100';
        }
    }
    $g=get_jz($yz,$n,$c);
    foreach($g as $k1 => $v1){
        $max_jz[]=$v1['jz'];//价值
        $max_qf[]=$k1;//取法
        $max_zl[]=$v1['zl'];//当前取法总重量
    }
    $return['jz']=$jz=max($max_jz);//最大价值
    $str='可取得最大价值为'.$jz;
    $nn=1;
    foreach($g as $k1 => $v1){
        if($v1['jz']==$jz){
            $return['data'][$k1]=$v1['zl'];
            $str .= ',取法'.$nn.':';
            $arr=explode('_',ltrim($k1,'_'));
            foreach($arr as $k2=>$v2){
                $arr_x=explode('%',$v2);
                $str_f=$arr_x[1]?'<span style="color:blue;">✔</span>':'<span style="color:red;">✘</span>';
                $str .= '第'.$arr_x[0].'种'.$str_f.',';
            }
            $str .= '当前取法总重量为'.$v1['zl'].'。';
            $nn++;
        }
    }
    $return['xx']=$str;
    return $return;
}
//已知数据中取得所有可能值($yz 已知数,$fz 已经放置记录(每个物品的放置记录,0 不放 1 放) $n 物品种类数 ,$yg 已经过的几个)
function get_jz($yz,$n,$c,$yg=0,$fz=[]){
    $arr=[];
    if(count($fz)){
        foreach($fz as $kk=>$vv){
            $str = $kk.'_'.($yg+1).'%0';
            $str1 = $kk.'_'.($yg+1).'%1';
            $arr[$str]=$vv;//当前物种不选时
            //选择当前种类,总量不能超过背包容量
            if($vv['zl']+$yz[$yg][0]<=$c){
                $arr[$str1]['zl']=$vv['zl']+$yz[$yg][0];
                $arr[$str1]['jz']=$vv['jz']+$yz[$yg][1];
            }
        }
        if($yg >= ($n - 1)){
            return $arr;
        }else{
            return get_jz($yz,$n,$c,$yg+1,$arr);
        }
    }else{
        $str = '_'.'1%0';
        $str1 = '_'.'1%1';
        $arr[$str]['zl']=0;
        $arr[$str]['jz']=0;
        //重量不超过背包容量
        if($yz[0][0] <= $c){
            $arr[$str1]['zl']=$yz[0][0];
            $arr[$str1]['jz']=$yz[0][1];
        }
        if($yg >= ($n - 1)){
            return $arr;
        }else{
            return get_jz($yz,$n,$c,$yg+1,$arr);
        }
    }
}