背包问题-递归思想(C语言)
目錄
問題描述
問題示例
輸入輸出
遞歸定義
遞歸函數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(488):文本标签
- 下一篇: 现在还有人玩暗黑2吗?