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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

背包问题-递归思想(C语言)

發布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 背包问题-递归思想(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

問題描述

問題示例

輸入輸出

遞歸定義

遞歸函數

用法示例:

結果展示


問題描述

設有一個背包可以放入物品的重量為s,現有n件物品,重量分別為w[0], w[1], …,w[n - 1]。
能否從這n件物品中選擇若干件放入此背包使得放入的重量之和正好等于s。
如果存在一種符合上述要求的選擇,則稱此背包問題有解:否則,稱此背包問題無解。

問題示例

s = 10,n=6, 物品重量為{ 1,8,4,3,5,2 }時

可找到下列4組解:{ 1,4,3,2 },{ 1,4,5 },{ 8,2 },{ 3,5,2 }。

輸入輸出

用戶輸入重量s、n以及n件物品的重量

如果有解則輸出所有的解。

如果無解,則輸出背包問題無解。

遞歸定義

true表示有解,false表示無解

s=0? ? ? ? ? ? ? ? ? ? ?true? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?此時問題有解

s<0或者n<1? ? ? ? false? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?總重量和物品件數不能為負數

s>0且n>=1? ? ? ? ?KNAP(s,w,n-1)? ? ? ? ? ? ? ? ? 所選物品不包括w[n-1]

s>0且n>=1? ? ? ? ?KNAP(s-w[n-1],n-1)? ? ? ? ? 所選物品包括w[n-1]? ? ?

遞歸函數

int pick[6] = { 0 };//記錄要打印的物品的下標 int sz = 0;//記錄打印答案的個數 int flag = 0; //標志符號:記錄有沒有解 int KNAP(int s, int w[], int n) {if (s == 0){printf("{ ");for (int i = 0; i < sz; i++){printf("%d ", w[pick[i]]);}printf("},");flag = 1;return 1;}else if (s < 0 || n < 1)return 0;else{KNAP(s, w, n - 1);//所選物品不包括w[n-1]pick[sz++] = n - 1;//記錄要打印的物品的下標 KNAP(s - w[n - 1], w, n - 1);// 所選物品包括w[n-1] sz--;}return flag; }

用法示例:

#include<stdio.h> int pick[6] = { 0 };//記錄要打印的物品的下標 int sz = 0;//記錄打印答案的個數 int flag = 0; //標志符號:記錄有沒有解 int KNAP(int s, int w[], int n) {if (s == 0){printf("{ ");for (int i = 0; i < sz; i++){printf("%d ", w[pick[i]]);}printf("},");flag = 1;return 1;}else if (s < 0 || n < 1)return 0;else{KNAP(s, w, n - 1);//所選物品不包括w[n-1]pick[sz++] = n - 1;KNAP(s - w[n - 1], w, n - 1);// 所選物品包括w[n-1] sz--;}return flag; }int main() {int s= 0;int n = 0;int w[100] = { 0 };printf("請輸入一個背包可以放入物品的重量:\n");scanf_s("%d", &s);printf("請輸入物品的個數:\n");scanf_s("%d", &n);printf("請輸入物品的重量:\n");for (int i = 0; i < n; i++){scanf_s("%d", &w[i]);}if (KNAP(s, w, n))printf("有解\n");elseprintf("背包問題\n");return 0; }

結果展示

總結

以上是生活随笔為你收集整理的背包问题-递归思想(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。