背包问题-递归思想(C语言)
生活随笔
收集整理的這篇文章主要介紹了
背包问题-递归思想(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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(488):文本标签
- 下一篇: [python 进阶] 第7章 函数装饰