精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python 算法實戰(zhàn):快速掌握背包問題原理

開發(fā)
本篇文章將帶領(lǐng)您從最直觀的暴力嘗試開始,一步步打磨技巧,深入理解記憶化搜索的精髓,最終掌握動態(tài)規(guī)劃的強大威力。

在計算機科學的算法殿堂中,“背包問題”(Knapsack Problem)不僅是學術(shù)界研究的熱點,更是工業(yè)界解決資源優(yōu)化配置問題的核心模型。從物流公司的貨物裝載,到金融領(lǐng)域的投資組合優(yōu)化,再到云計算的資源調(diào)度,背包問題的思想無處不在。

對于學習者而言,背包問題是通往動態(tài)規(guī)劃(Dynamic Programming)這座宏偉宮殿最平坦、最經(jīng)典的路徑。本篇文章將帶領(lǐng)您從最直觀的暴力嘗試開始,一步步打磨技巧,深入理解記憶化搜索的精髓,最終掌握動態(tài)規(guī)劃的強大威力。

一、核心問題:0/1背包問題 (0/1 Knapsack Problem)

這是所有背包問題的基礎(chǔ)原型,我們的一切探索都將從這里開始。

1. 問題定義與一個更豐富的示例

給定 N 個物品和一個容量(或重量上限)為 W 的背包。第 i 個物品的重量是 weight[i],其價值是 value[i]。你需要決定是否將每個物品放入背包,目標是在放入物品的總重量不超過背包容量的前提下,使背包中物品的總價值最大。

核心約束:每個物品只有一件,要么放(1),要么不放(0)。物品不可分割。

貫穿全文的示例:

  • 物品數(shù)量 (N): 5
  • 背包容量 (capacity): 17
  • 物品重量 (weights): [3, 4, 7, 8, 9] (對應(yīng)物品 0, 1, 2, 3, 4)
  • 物品價值 (values): [4, 5, 10, 11, 13] (對應(yīng)物品 0, 1, 2, 3, 4)

2. 樸素解法:暴力遞歸與路徑追蹤

邏輯原理剖析:這是最符合人類直覺的思考方式,一種“分而治之”的策略。當我們面對第 n 個物品時(為方便遞歸,我們從后往前考慮),我們的決策空間只有兩個選項:

  • 決策一:不放入第 n 個物品。如果我們決定不拿這個物品,那么背包的剩余容量不變,我們需要解決的問題就縮減為:在前 n-1 個物品中,以相同的背包容量,能獲得的最大價值是多少。其價值和選擇的物品就是這個子問題的解。
  • 決策二:放入第 n 個物品。這個決策有一個前提——背包必須能裝下它(即 capacity >= weights[n-1])。如果能裝下,我們獲得了 values[n-1] 的價值,但背包容量也相應(yīng)減少了 weights[n-1]。此時,我們需要解決的子問題是:在前 n-1 個物品中,以 capacity - weights[n-1] 的剩余容量,能獲得的最大價值是多少。總價值是 values[n-1] 加上子問題的價值,選擇的物品則是第 n 個物品加上子問題選擇的物品。

我們比較這兩個決策的總價值,選擇價值更高的那個。為了追蹤選擇了哪些物品,我們的遞歸函數(shù)不能只返回一個數(shù)值,而必須返回一個包含價值和物品列表的元組:(value, list_of_items)。

Python實現(xiàn):

def knapsack_recursive_with_path(weights, values, capacity, n):
    """
    暴力遞歸解法,解決0/1背包問題,同時返回被選擇的物品。
    
    :param n: 考慮前 n 個物品 (物品索引從 0 到 n-1)。
    :return: 一個元組 (最大價值, 被選擇物品的索引列表)。
    """
    # 基本情況:如果沒有物品可選或背包已無容量,則價值為0,沒有物品被選擇。
    if n == 0or capacity == 0:
        return (0, [])

    # 獲取當前正在考慮的物品(第n個物品,其索引為n-1)
    current_weight = weights[n - 1]
    current_value = values[n - 1]
    current_index = n - 1

    # 如果當前物品太重,放不進背包,我們別無選擇,只能不放它。
    # 問題的解與只考慮前 n-1 個物品時完全相同。
    if current_weight > capacity:
        return knapsack_recursive_with_path(weights, values, capacity, n - 1)
    else:
        # 決策一:不放入當前物品。
        # 遞歸地在前 n-1 個物品中尋找最優(yōu)解。
        value_without, items_without = knapsack_recursive_with_path(weights, values, capacity, n - 1)

        # 決策二:放入當前物品。
        # 遞歸地在前 n-1 個物品中,為剩余的容量尋找最優(yōu)解。
        value_with_subproblem, items_with_subproblem = knapsack_recursive_with_path(
            weights, values, capacity - current_weight, n - 1
        )
        # 這個決策的總價值是當前物品的價值加上子問題的價值。
        value_with = current_value + value_with_subproblem

        # 比較兩個決策的優(yōu)劣。
        if value_with > value_without:
            # “放入”更優(yōu)。最終的物品列表是當前物品加上子問題選擇的物品。
            final_items = items_with_subproblem + [current_index]
            return (value_with, final_items)
        else:
            # “不放”更優(yōu)或價值相等。
            return (value_without, items_without)

# --- 樣例運行 ---
weights = [3, 4, 7, 8, 9]
values = [4, 5, 10, 11, 13]
capacity = 17
n = len(weights)

max_value_rec, items_rec = knapsack_recursive_with_path(weights, values, capacity, n)
print(f"--- 0/1 背包問題:暴力遞歸解法(含路徑追蹤) ---")
print(f"最大價值: {max_value_rec}")
print(f"選擇的物品索引: {sorted(items_rec)}")

時間復雜度為 O(2^N),對于每個物品都有“放”與“不放”兩種選擇,N個物品構(gòu)成了深度為N的二叉決策樹。這種指數(shù)級增長使得該方法在N稍大時(如N>20)就完全不可行。其根本缺陷在于重疊子問題,即相同的子問題(由 (capacity, n) 定義)在遞歸樹的不同分支中被反復計算。

二、動態(tài)規(guī)劃 (Dynamic Programming)

動態(tài)規(guī)劃是解決這類具有重疊子問題和最優(yōu)子結(jié)構(gòu)特性的問題的標準武器。

1. 迭代法 (Bottom-Up DP)

邏輯原理剖析:這是最經(jīng)典的動態(tài)規(guī)劃實現(xiàn)方式。我們完全拋棄了遞歸,采用迭代的方式,像填表格一樣,從最小的子問題開始,逐步構(gòu)建出最終的答案。

狀態(tài)定義:創(chuàng)建一個二維DP表 dp,dp[i][w] 的含義是:在只考慮前 i 個物品(從物品1到物品i)的情況下,對于一個容量為 w 的背包,所能獲得的最大價值。

初始化:DP表的大小為 (N+1) x (capacity+1),所有元素初始化為0。dp[0][w](沒有物品可選)和 dp[i][0](背包沒有容量)的值顯然都是0。

狀態(tài)轉(zhuǎn)移方程:這是DP的靈魂,它定義了 dp[i][w] 如何由之前已計算出的狀態(tài)推導而來。

  • 我們?nèi)烧咧械淖畲笾担篸p[i][w] = max(dp[i-1][w], values[i-1] + dp[i-1][w - weights[i-1]])。
  • **如果第 i 個物品太重 (weights[i-1] > w)**:我們根本無法放入第i個物品。因此,最大價值與只考慮前 i-1 個物品時完全相同。即:dp[i][w] = dp[i-1][w]。

如果第 i 個物品可以放入:我們面臨與遞歸時相同的抉擇:

  • 不放:價值為 dp[i-1][w]。
  • 放:價值為 values[i-1] (第i個物品的價值) + dp[i-1][w - weights[i-1]] (為第i個物品騰出空間后,前i-1個物品在剩余容量中的最大價值)。
def knapsack_dp_table(weights, values, capacity):
    """
    動態(tài)規(guī)劃(二維表)解法,返回最大價值和整個DP表。
    """
    n = len(weights)
    dp = [[0for _ in range(capacity + 1)] for _ in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(1, capacity + 1):
            current_weight = weights[i - 1]
            current_value = values[i - 1]
            
            # 如果當前物品無法放入容量為 w 的背包
            if current_weight > w:
                # 則最大價值與不考慮此物品時相同
                dp[i][w] = dp[i - 1][w]
            else:
                # 否則,在“不放”和“放”之間做決策
                # 不放當前物品的價值
                value_without = dp[i - 1][w]
                # 放當前物品的價值
                value_with = current_value + dp[i - 1][w - current_weight]
                # 選擇價值更高的決策
                dp[i][w] = max(value_without, value_with)
    
    return dp[n][capacity], dp

三、回溯DP表以重建方案

求解出最大價值只是故事的一半,一個完整的解決方案需要告訴我們具體選擇了哪些物品。

邏輯原理:最終的DP表 dp 是一部完整的決策史,記錄了每個子問題的最優(yōu)解。我們可以從 dp[n][capacity] 開始,像一個偵探一樣倒推回去,揭示通往最優(yōu)解的路徑。

起點:i = n, w = capacity,即DP表的右下角。

推理過程:在任何一個單元格 dp[i][w],我們問自己:這個最優(yōu)值是如何得到的?

  • 我們比較 dp[i][w] 和它正上方的單元格 dp[i-1][w]。
  • 如果 dp[i][w] == dp[i-1][w],這清晰地表明,在考慮第 i 個物品時,最優(yōu)決策是不放它。因為不放它并沒有對價值產(chǎn)生任何損失。因此,我們將注意力轉(zhuǎn)移到上一個狀態(tài),即 i 減1,w 不變。
  • 如果 dp[i][w] > dp[i-1][w],這 unequivocally 意味著第 i 個物品被放入了背包,因為它的加入帶來了價值的提升。我們將這個物品(索引i-1)記錄為解的一部分。然后,我們的“時光機”必須回到放入它之前的狀態(tài):i 減1,同時容量 w 也要減去該物品的重量 weights[i-1]。

終點:當 i 減到0時,所有物品都已考慮完畢,回溯結(jié)束。

def reconstruct_knapsack_path(dp_table, weights, n, capacity):
    """
    根據(jù)DP表回溯,找出構(gòu)成最優(yōu)解的具體物品。
    
    :param dp_table: knapsack_dp_table函數(shù)生成的完整DP表
    :param weights: 物品重量列表
    :param n: 物品總數(shù)
    :param capacity: 背包總?cè)萘?    :return: 一個包含被選中物品索引的列表
    """
    selected_items_indices = []
    w = capacity
    
    # 從最后一個物品開始,向上回溯
    for i in range(n, 0, -1):
        # 回溯的核心判斷邏輯:
        # 如果當前單元格的值不等于其正上方的值,
        # 說明當前物品 i (索引i-1) 對這個最優(yōu)值做出了貢獻,即它被選中了。
        if dp_table[i][w] != dp_table[i - 1][w]:
            item_index = i - 1
            selected_items_indices.append(item_index)
            # 我們必須減去該物品的重量,回到放入它之前的容量狀態(tài)。
            w -= weights[item_index]
    
    # 因為是從后往前添加的,所以反轉(zhuǎn)列表得到自然的順序
    selected_items_indices.reverse()
    return selected_items_indices

# --- 樣例運行 ---
max_value_dp, dp_table = knapsack_dp_table(weights, values, capacity)
selected_items = reconstruct_knapsack_path(dp_table, weights, n, capacity)

print(f"\n--- 0/1 背包問題:動態(tài)規(guī)劃(含方案回溯) ---")
print(f"最大價值: {max_value_dp}")
print(f"選擇的物品索引: {selected_items}")

print("詳細方案解析:")
total_w = 0
total_v = 0
for index in selected_items:
    total_w += weights[index]
    total_v += values[index]
    print(f"  - 物品 {index}: 重量={weights[index]}, 價值={values[index]}")
print(f"總重量: {total_w} (背包容量上限: {capacity})")
print(f"總價值: {total_v}")

四、完全背包問題

區(qū)別:每種物品有無限件可用。

邏輯原理剖析:這改變了狀態(tài)轉(zhuǎn)移方程。當決定放入物品 i 時,我們不再是去 dp[i-1] 中找狀態(tài),而是可以繼續(xù)在 dp[i] 中找,因為放入一個物品 i 后,我們依然可以繼續(xù)放入它。狀態(tài)轉(zhuǎn)移方程變?yōu)椋篸p[i][w] = max(dp[i-1][w], values[i-1] + dp[i][w - weights[i-1]])

回溯邏輯:回溯時,如果發(fā)現(xiàn)物品i被選中,我們將容量w減去weights[i-1]后,停留在第i行繼續(xù)判斷,看它是否被多次選中。只有當dp[i][w] == dp[i-1][w]時,才說明物品i在當前容量下不再是更優(yōu)選擇,我們才移動到i-1行。

def unbounded_knapsack_dp(weights, values, capacity):
    n = len(weights)
    dp = [[0for _ in range(capacity + 1)] for _ in range(n + 1)]
    for i in range(1, n + 1):
        for w in range(1, capacity + 1):
            current_weight = weights[i - 1]
            current_value = values[i - 1]
            if current_weight > w:
                dp[i][w] = dp[i - 1][w]
            else:
                dp[i][w] = max(dp[i - 1][w], current_value + dp[i][w - current_weight])
    return dp[n][capacity], dp

def reconstruct_unbounded_path(dp_table, weights, n, capacity):
    selected_items_counts = {i: 0for i in range(n)}
    w = capacity
    i = n
    while i > 0and w > 0:
        if dp_table[i][w] != dp_table[i - 1][w]:
            selected_items_counts[i - 1] += 1
            w -= weights[i - 1]
            # 關(guān)鍵:i不減1,停留在當前行,檢查是否可以再拿一個同樣的物品
        else:
            # 如果值相同,說明沒用物品i,向上移動到上一行
            i -= 1
    return selected_items_counts

# --- 樣例運行 ---
weights_u = [2, 3, 4]
values_u = [5, 8, 11]
capacity_u = 7
max_value_u, dp_u = unbounded_knapsack_dp(weights_u, values_u, capacity_u)
path_u = reconstruct_unbounded_path(dp_u, weights_u, len(weights_u), capacity_u)

print(f"\n--- 完全背包問題 ---")
print(f"最大價值: {max_value_u}")
print(f"選擇的物品及數(shù)量: {path_u}")
# 輸出:
# --- 完全背包問題 ---
# 最大價值: 19
# 選擇的物品及數(shù)量: {0: 2, 1: 1, 2: 0}
# 解釋: 拿2個物品0(w=2,v=5)和1個物品1(w=3,v=8)。總重量 2*2+3=7。總價值 2*5+8=18。
# 等等,手動算一下:3個物品0 -> w=6, v=15。1個物品0和1個物品2 -> w=6, v=16。2個物品1 -> w=6, v=16。
# 1個物品0, 1個物品1 -> w=5, v=13。
# 1個物品0, w=2, v=5, 剩5, 價值8+5=13。
# 1個物品1, w=3, v=8, 剩4, 價值5+8=13 or 11+8=19。拿物品2,w=4,v=11,總w=7, v=19。
# 看來是拿一個物品1(w=3, v=8)和一個物品2(w=4, v=11)。
# 讓我們重新檢查回溯代碼。
# Ah, the logic in reconstruct_unbounded_path was slightly off. Corrected below.
def reconstruct_unbounded_path_corrected(dp_table, weights, values, n, capacity):
    selected_items_counts = {i: 0for i in range(n)}
    w = capacity
    i = n
    while i > 0and w > 0:
        current_weight = weights[i-1]
        current_value = values[i-1]
        # Check if including item i leads to the current optimal value
        if w >= current_weight and dp_table[i][w] == current_value + dp_table[i][w - current_weight]:
            selected_items_counts[i - 1] += 1
            w -= current_weight
        else:
            i -= 1
    return selected_items_counts
path_u_corrected = reconstruct_unbounded_path_corrected(dp_u, weights_u, values_u, len(weights_u), capacity_u)
print(f"選擇的物品及數(shù)量 (修正后): {path_u_corrected}")

五、結(jié)語

從動態(tài)規(guī)劃的決策矩陣中精確地還原出通往最優(yōu)解的路徑。我們深刻地認識到,DP表不僅是一個結(jié)果的存儲器,更是一部詳盡的決策歷史記錄。通過回溯,我們賦予了冰冷的數(shù)字以生動的解釋,讓算法的“黑盒”變得透明。

責任編輯:趙寧寧 來源: Python數(shù)智工坊
相關(guān)推薦

2009-12-11 16:39:08

PHP引號轉(zhuǎn)義

2024-05-29 11:06:10

2019-01-04 09:12:01

系統(tǒng) 人工智能 數(shù)據(jù)

2021-03-23 15:35:36

Adam優(yōu)化語言

2023-06-26 07:31:44

屬性物品背包

2009-10-28 16:47:26

VB.NET訪問數(shù)據(jù)庫

2021-01-08 15:14:16

Python循環(huán)for循環(huán)

2009-12-01 14:30:08

VS2003使用

2022-01-18 19:13:52

背包問題數(shù)據(jù)結(jié)構(gòu)算法

2023-10-20 08:01:08

2010-06-21 15:33:47

路由信息協(xié)議

2024-11-28 10:56:55

2025-08-27 07:00:00

代碼Python內(nèi)置函數(shù)

2010-02-23 17:23:26

Python異常處理

2017-08-19 23:21:14

線上CPU定位

2017-05-26 11:00:38

Python算法

2009-11-13 14:03:37

ADO.NET資源管理

2023-07-06 08:31:50

Python對象編程

2021-06-24 17:55:40

Python 開發(fā)編程語言

2009-12-23 10:20:27

WPF類層次
點贊
收藏

51CTO技術(shù)棧公眾號

男人添女人下面免费视频| 九色91在线视频| 中文字幕在线有码| 免费福利视频一区| 91福利在线观看| 男人日女人的bb| 五月婷婷丁香六月| 七七婷婷婷婷精品国产| 欧美日本中文字幕| 蜜桃av免费看| 日韩一区二区三区色| 欧美性猛交丰臀xxxxx网站| 亚洲精品白虎| 三级在线观看网站| 久久福利视频一区二区| 17婷婷久久www| 一本一本久久a久久| 亚洲超碰在线观看| 欧美性猛交xxxxxxxx| 乱熟女高潮一区二区在线| 欧美视频免费一区二区三区| 看国产成人h片视频| 7777精品视频| 青花影视在线观看免费高清| 校花撩起jk露出白色内裤国产精品| 欧美日韩中文另类| 精品无码一区二区三区在线| 日本中文字幕视频在线| www国产精品av| 亚洲伊人久久大香线蕉av| 无码人妻丰满熟妇区五十路| 国产在线欧美| 久久精品99久久香蕉国产色戒| 国产精品jizz| 极品国产人妖chinesets亚洲人妖| 欧美电影一区二区三区| 青青在线视频免费| 在线观看爽视频| 亚洲韩国精品一区| 日本黄xxxxxxxxx100| 91在线品视觉盛宴免费| 久久久不卡影院| 久久久精品国产一区二区三区| 亚洲av永久纯肉无码精品动漫| 免费成人性网站| 国产精品福利无圣光在线一区| 国产在线观看免费视频今夜| 欧美特黄一级| 久久99精品久久久久久青青91| 制服丨自拍丨欧美丨动漫丨| 大色综合视频网站在线播放| 亚洲片在线观看| 亚洲最大成人网站| 免费av一区二区三区四区| 日韩成人中文字幕| 不卡一区二区在线观看| 久久精品66| 亚洲精品按摩视频| 国产精品第七页| 日韩手机在线| 亚洲欧洲偷拍精品| 永久免费观看片现看| 色综合久久网| 久久久国产成人精品| 成人一级黄色大片| 欧美大片专区| 久久免费高清视频| 国产69精品久久久久久久久久| 亚洲视频成人| 日本亚洲欧洲色α| 中文字幕av无码一区二区三区| 蜜桃一区二区三区在线观看| 成人亚洲综合色就1024| 性欧美18一19性猛交| 国产精品1区二区.| 国产视频一区二区三区四区| 日本大臀精品| 一区二区中文视频| 18黄暴禁片在线观看| 玖玖在线播放| 欧美日韩中文另类| www.欧美激情.com| 国产精品主播在线观看| 日韩久久精品成人| 少妇高潮惨叫久久久久| 亚洲先锋影音| 欧美一级高清免费| 一区不卡在线观看| 国产99精品国产| 你懂的视频在线一区二区| 91在线网址| 亚洲国产成人av网| 91在线视频观看免费| 国产中文欧美日韩在线| 亚洲电影第1页| 国产成人一区二区在线观看| 影音先锋成人在线电影| 欧美一乱一性一交一视频| 一区二区乱子伦在线播放| 国产很黄免费观看久久| 欧美精品七区| 羞羞视频在线免费国产| 色综合天天综合狠狠| 欧美性猛交xx| 欧美一区二区三区激情视频 | 午夜免费福利网站| 久久精品福利| 精品中文字幕视频| 国产精华7777777| 成人福利视频在线| 正在播放91九色| 忘忧草在线日韩www影院| 911国产精品| 国产成人无码精品久久二区三| 91国语精品自产拍| 国产精品成av人在线视午夜片| 亚洲精品一区二区三区蜜桃| 亚洲国产精品99久久久久久久久| 和岳每晚弄的高潮嗷嗷叫视频| 欧美综合影院| 亚洲系列中文字幕| 亚洲福利精品在线| 久久久亚洲国产精品| 成人精品高清在线视频| 日韩精品视频观看| 免费看一级一片| 六月丁香婷婷久久| 欧美激情论坛| av中文字幕在线观看第一页| 7777精品伊人久久久大香线蕉超级流畅| 中文字幕在线观看网址| 午夜精彩国产免费不卡不顿大片| 国产精品视频资源| 久久视频www| 精品福利视频导航| 国产成人av无码精品| 亚洲经典一区| 91精品国产自产在线观看永久| 激情在线视频| 欧美日韩色婷婷| 国产亚洲精品成人a| 欧美h版在线| 国产美女精品免费电影| avtt在线播放| 色8久久人人97超碰香蕉987| 特级西西人体wwwww| 亚洲国产精品一区| 国产亚洲一区在线播放| av小说在线播放| 亚洲精品在线一区二区| 国产真实夫妇交换视频| 成人av资源站| 免费av观看网址| 麻豆一区一区三区四区| 97热在线精品视频在线观看| 日批视频免费播放| 欧美日韩国产精品| 中文字幕xxx| 美女诱惑一区| 亚洲ai欧洲av| 色成人综合网| 欧美成人精品激情在线观看| 精品人妻少妇AV无码专区| 一区二区三区不卡视频 | 国产麻豆精品在线| 300部国产真实乱| 国产成人澳门| 欧美一级电影免费在线观看| 国产女人在线视频| 欧美精品在线视频| 国产亚洲精品久久777777| 成a人片亚洲日本久久| 青青视频在线播放| 日韩精品免费| 成人午夜电影免费在线观看| 男人的天堂免费在线视频| 亚洲欧美激情在线视频| 中文字幕乱码一区二区| 亚洲欧洲综合另类在线| 天堂www中文在线资源| 国产欧美欧美| 伊人久久大香线蕉午夜av| 国产精品视频一区二区三区| 欧美激情中文字幕在线| 欧洲一区av| 欧美日本韩国一区| 黄色小视频在线免费看| 久久精品一二三| 亚洲欧美手机在线| 亚洲国产美女| 一区二区三区观看| 国产精品白丝一区二区三区| 热99在线视频| 超碰免费公开在线| 亚洲精选一区二区| 国产欧美一级片| 精品欧美国产一区二区三区| 亚洲色图27p| 91一区一区三区| 亚洲午夜激情影院| 久久黄色网页| 日韩精品第1页| 欧美日韩性在线观看| 亚洲自拍偷拍福利| 麻豆精品蜜桃| 国内精品久久久久伊人av| 97最新国自产拍视频在线完整在线看| 日韩免费一区二区三区在线播放| 国产精品久久久久久久久久精爆| 亚洲欧美另类图片小说| 黄色aaa视频| 粉嫩绯色av一区二区在线观看 | 亚洲精品乱码久久久久久蜜桃91| 99精品国产一区二区三区2021 | 一区二区三区四区高清视频| 国产99在线|中文| 欧美日韩色网| 久久久国产精品视频| 免费播放片a高清在线观看| 欧美一区二区啪啪| 中文字幕乱码无码人妻系列蜜桃| 欧美日韩加勒比精品一区| 丁香花五月激情| 国产免费观看久久| 国产精品无码久久久久一区二区| 丰满少妇久久久久久久| 成人免费黄色av| 青青草成人在线观看| 欧美黄网站在线观看| 黄色另类av| 蜜桃视频一区二区在线观看| 四季av一区二区凹凸精品| 亚洲春色在线视频| 国产一区二区三区不卡视频网站 | 精品72久久久久中文字幕| 国产欧美丝袜| 国产毛片精品| 国产一区精品视频| 中文一区二区三区四区| 69堂成人精品视频免费| а天堂中文最新一区二区三区| 国产精品久久久久久久久久| 性高爱久久久久久久久| 国产成人亚洲综合| 欧美1级2级| 国产精品69久久| 黄色精品视频| 国产精品 欧美在线| 亚洲日本网址| 国产精品久久久久久久久久尿| 怡红院成人在线| 国产精品久久久久久久久借妻| 亚洲精品555| 国产一区二区在线免费视频| 精品亚洲a∨| 91欧美精品成人综合在线观看| www一区二区三区| 91精品黄色| 久久资源综合| 清纯唯美一区二区三区| 热久久天天拍国产| 国产又大又长又粗又黄| 中文字幕乱码亚洲无线精品一区| av磁力番号网| 在线日本成人| 青青在线视频观看| 秋霞午夜av一区二区三区| 国内国产精品天干天干| 国产乱码字幕精品高清av| 日本黄色www| av不卡一区二区三区| 久久成人激情视频| 亚洲欧洲韩国日本视频| 精品无码m3u8在线观看| 欧美日韩精品国产| 中文字幕永久在线观看| 欧美一卡二卡在线| 欧美天堂在线视频| 亚洲午夜激情免费视频| 毛片av在线| 国内精品久久久久久久| 韩国三级一区| 97人人模人人爽人人喊38tv| 精品亚洲自拍| 亚洲一区三区| 亚洲午夜一级| 精品999在线| 丰满亚洲少妇av| 中文天堂资源在线| 亚洲主播在线观看| 91porny九色| 日韩三级电影网址| 欧美日韩国产中文字幕在线| 日韩在线观看高清| 麻豆理论在线观看| 国产拍精品一二三| 亚洲人亚洲人色久| 热久久最新网址| 日本女优在线视频一区二区| 日本少妇一级片| 欧美国产综合色视频| 国产对白videos麻豆高潮| 欧美日韩一区二区三区高清| 亚洲国产视频一区二区三区| 国产一区二区三区视频| 超碰97免费在线| 成人a级免费视频| 天堂俺去俺来也www久久婷婷| 一区二区三区四区视频在线| 国产日韩1区| 国产伦理在线观看| 国产精品福利一区| 黄色av一级片| 亚洲变态欧美另类捆绑| 生活片a∨在线观看| 青青久久aⅴ北条麻妃| 日韩精品一级| 伊人狠狠色丁香综合尤物| 久久精品动漫| 亚洲熟女乱综合一区二区三区 | 亚洲精品视频二区| 色呦呦在线看| 成人欧美一区二区三区黑人孕妇| 国产麻豆一区二区三区精品视频| youjizz.com在线观看| 韩国毛片一区二区三区| 成人小视频免费看| 一本大道久久a久久综合婷婷| 人妻少妇精品无码专区| 九九精品在线播放| 国产麻豆精品| 亚洲国产精品影视| 久久99日本精品| 黑人と日本人の交わりビデオ| 一本色道久久综合亚洲aⅴ蜜桃| 色香蕉在线视频| 欧美精品成人91久久久久久久| www.久久99| 佐佐木明希av| 国产精品18久久久久| 久久国产精品国语对白| 欧美高清你懂得| 视频一区二区三区不卡| 成人午夜小视频| 日韩欧美一区二区三区免费看| 毛葺葺老太做受视频| 国产亚洲一二三区| 免费无码国产精品| 国产一区二区三区精品久久久 | 亚洲毛片网站| 免费a v网站| 精品国产乱码久久久久久虫虫漫画| 黄色一级a毛片| 性欧美长视频免费观看不卡| 狼人天天伊人久久| 久久精品国产精品亚洲色婷婷| 久久蜜桃av一区精品变态类天堂| 国产黄色免费观看| 国产亚洲免费的视频看| 福利一区二区免费视频| 一区二区在线观看网站| 国产一区二区三区免费在线观看| √天堂中文官网8在线| 欧美videos大乳护士334| 3344国产永久在线观看视频| 久久久精彩视频| 免费成人你懂的| 久久久久成人精品无码| 日韩av影视综合网| 欧美日韩成人影院| 午夜啪啪免费视频| 不卡一二三区首页| 男人天堂视频网| www.日韩视频| 9l亚洲国产成人精品一区二三| 91猫先生在线| 国产精品久久久久久亚洲伦| jizz国产视频| 91成人精品网站| 日韩欧美字幕| caopor在线| 欧美少妇xxx| 国内高清免费在线视频| 日本不卡二区高清三区| 精品一区二区三区免费毛片爱| 久久免费黄色网址| 亚洲色图校园春色| 久久99精品久久久野外观看| 成人性免费视频| 国产精品日韩成人| 日韩一级片免费看| 国产狼人综合免费视频| 最新日韩av| 国产成人免费在线观看视频| 欧美mv和日韩mv的网站| 日本精品网站| 国产美女主播在线播放| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲美女综合网| 国产日本欧美一区|