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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

目錄

問題描述

問題示例

輸入輸出

遞歸定義

遞歸函數(shù)

用法示例:

結(jié)果展示


問題描述

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

問題示例

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

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

輸入輸出

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

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

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

遞歸定義

true表示有解,false表示無解

s=0? ? ? ? ? ? ? ? ? ? ?true? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?此時(shí)問題有解

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

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]? ? ?

遞歸函數(shù)

int pick[6] = { 0 };//記錄要打印的物品的下標(biāo) int sz = 0;//記錄打印答案的個(gè)數(shù) int flag = 0; //標(biāo)志符號(hào):記錄有沒有解 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;//記錄要打印的物品的下標(biāo) KNAP(s - w[n - 1], w, n - 1);// 所選物品包括w[n-1] sz--;}return flag; }

用法示例:

#include<stdio.h> int pick[6] = { 0 };//記錄要打印的物品的下標(biāo) int sz = 0;//記錄打印答案的個(gè)數(shù) int flag = 0; //標(biāo)志符號(hào):記錄有沒有解 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("請(qǐng)輸入一個(gè)背包可以放入物品的重量:\n");scanf_s("%d", &s);printf("請(qǐng)輸入物品的個(gè)數(shù):\n");scanf_s("%d", &n);printf("請(qǐng)輸入物品的重量:\n");for (int i = 0; i < n; i++){scanf_s("%d", &w[i]);}if (KNAP(s, w, n))printf("有解\n");elseprintf("背包問題\n");return 0; }

結(jié)果展示

總結(jié)

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

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