久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1520|回復: 0
打印 上一主題 下一主題
收起左側

0-1背包問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-5 20:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    發現很多重量級的公司都十分喜愛回溯法,可是鑒于回溯法稍微的復雜,就找了一個較為簡單的動態規劃的方法來解此題。
動態規劃是用空間換時間的一種方法的抽象。其關鍵是發現子問題和記錄其結果。然后利用這些結果減輕運算量。
比如01背包問題。
/* 一個旅行者有一個最多能用M公斤的背包,現在有N件物品,
它們的重量分別是W1,W2,...,Wn,
它們的價值分別為P1,P2,...,Pn.
若每種物品只有一件求旅行者能獲得最大總價值。
輸入格式:
M,N
W1,P1
W2,P2
......
輸出格式:
X
*/
因為背包最大容量M未知。所以,我們的程序要從1到M一個一個的試。比如,開始任選N件物品的一個。看對應M的背包,能不能放進去,如果能放進去,并且還有多的空間,則,多出來的空間里能放N-1物品中的最大價值。怎么能保證總選擇是最大價值呢?看下表。
測試數據:
10,3
3,4
4,5
5,6


c[j]數組保存了1,2,3號物品依次選擇后的最大價值.
這個最大價值是怎么得來的呢?從背包容量為0開始,1號物品先試,0,1,2,的容量都不能放.所以置0,背包容量為3則里面放4.這樣,這一排背包容量為4,5,6,....10的時候,最佳方案都是放4.假如1號物品放入背包.則再看2號物品.當背包容量為3的時候,最佳方案還是上一排的最價方案c為4.而背包容量為5的時候,則最佳方案為自己的重量5.背包容量為7的時候,很顯然是5加上一個值了。加誰??很顯然是7-4=3的時候.上一排 c3的最佳方案是4.所以。總的最佳方案是5+4為9.這樣.一排一排推下去。最右下放的數據就是最大的價值了。(注意第3排的背包容量為7的時候,最佳方案不是本身的6.而是上一排的9.說明這時候3號物品沒有被選.選的是1,2號物品.所以得9.)
從以上最大價值的構造過程中可以看出。 f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}這就是書本上寫的動態規劃方程.這回清楚了嗎?
下面是實際程序:

#include<stdio.h>
int c[10][100];/*對應每種情況的最大價值*/
int knapsack(int m,int n)
{
int i,j,w[10],p[10];
for(i=1;i<n+1;i++)
        scanf("\n%d,%d",&w[i],&p[i]);
for(i=0;i<10;i++)
      for(j=0;j<100;j++)
           c[i][j]=0;/*初始化數組*/
for(i=1;i<n+1;i++)
      for(j=1;j<m+1;j++)
           {
            if(w[i]<=j) /*如果當前物品的容量小于背包容量*/
                     {
                      if(p[i]+c[i-1][j-w[i]]>c[i-1][j])

                           /*如果本物品的價值加上背包剩下的空間能放的物品的價值*/

                         /*大于上一次選擇的最佳方案則更新c[i][j]*/
                            c[i][j]=p[i]+c[i-1][j-w[i]];
                            else
                            c[i][j]=c[i-1][j];
                     }
              else c[i][j]=c[i-1][j];
            }
return(c[n][m]);
                    
}
int main()
{
    int m,n;int i,j;
    scanf("%d,%d",&m,&n);
    printf("Input each one:\n");
    printf("%d",knapsack(m,n));
    printf("\n");/*下面是測試這個數組,可刪除*/
     for(i=0;i<10;i++)
      for(j=0;j<15;j++)
         {
          printf("%d ",c[i][j]);
             if(j==14)printf("\n");
         }
    system("pause");
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品美女| 欧美成人第一页 | 欧美日韩精品一区二区 | 看一级毛片视频 | 黄色片在线 | 精品免费观看 | 男插女下体视频 | 在线视频一区二区三区 | 中文字幕av在线一二三区 | 在线观看国产h | 欧美一区二区三区视频在线播放 | 精品视频一区二区三区在线观看 | 天天看逼 | 欧美精品一区二区在线观看 | 在线观看中文字幕 | 久久精品国产一区二区三区不卡 | 国产精品久久久久久av公交车 | 日本久久久久久久久 | 欧美成视频 | 永久免费在线观看 | 黄色大片免费网站 | 婷婷久久综合 | 国产成人免费观看 | 高清亚洲 | 免费在线观看av网址 | 一区二区三区视频在线观看 | 国产一区二区三区四区 | 色播av| 日韩三区| 亚洲一区免费视频 | 亚洲一区二区三区在线观看免费 | 久久一级 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 亚洲精品一区二区三区在线 | 国产一级片免费视频 | 黄色在线免费网站 | 亚洲精品电影网在线观看 | 涩涩导航| 羞羞羞视频 | 日本三级在线 | 久久这里只有精品首页 |