Ka的递归编程练习 Part6|简单背包问题,拒绝动规从我做起

 1 #include <stdio.h>
 2 #define M 10
 3 int w[M]={1,3,5,7,9,11,13,15,17,19};
 4 int backpack(int n,int s) //n代表容量,s代表物品个数
 5 {
 6     if(n==0)    return 1;   //如果刚好装完,此支线满足条件,返回1
 7     else if(n<0||s<=0) return 0;  //此条支线出现了装一个重量超过限额或全部用完也未装满,返回0
 8     else if(backpack(n-w[s-1],s-1)==1)  //此条支线传来好消息,输出并往上一层返回1
 9     {                                   //此时注意下表是s-1,否则将越界
10         printf("bp:No.%d,weight %d.\n",s,w[s-1]);
11         return 1;
12     }
13     else return backpack(n,s-1);  //如果这个物品并未出现以上情况,就跳过,n不变
14 }
15 int main()
16 {
17     if(backpack(80,M)!=1) printf("No result.");  //当成功时返回1,所以不返回1时输出无解。
18     return 0;
19 }

差不多就是上面这样了,注释那么多就不多解释了吧~

问题的话:有一个背包,容量为n,现有s件物品,重量为w1,w2,w3,...,ws,求一组刚好能放完背包的组合解。如

w为{1,3,5,7,9},n为11时,解为w1:1   w2:3   w4:7

时间: 2024-10-12 11:59:23

Ka的递归编程练习 Part6|简单背包问题,拒绝动规从我做起的相关文章

0-1背包问题(动规基础,好吧虽然我现在在说大话,待续...)

(此位老兄的讲解深得我意,特来推荐:http://blog.csdn.net/insistgogo/article/details/8579597) 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. POINT: 1·每种物品仅有一件,可以选择放或不放. 2·子问题---将前i件物品放入容量为V的背包中.价值总和为f[i][V]; 若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵

Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s==0) return; 5 hanoi(s-1,a,c,b); //把最底下的从a借助c移动到b 6 printf("s from %c move to %c\n",a,c); 7 hanoi(s-1,b,a,c); //把刚才弄到b的借助a叠到c上 8 } 9 int main() 10

Ka的回溯编程练习 Part6.5|详解|有重复元素的排列问题

#include <stdio.h> #define br printf("\n"); int ans=0; char el[502]; int confirm(int i,int k) //往回比较,如果元素有相同跳过此情况 { if(i>k) { while(i>k) { if(el[i]==el[k]) return 0; k++; } } return 1; } void op(int n) { ans++; int j; for(j=0;j<=n

Ka的递归编程练习 Part8|回溯之二 排列组合

1 #include <stdio.h> 2 int resl[1000]={0},used[1000]={0}; 3 int n,r; 4 int tot=0; 5 void output() 6 { 7 tot++; 8 printf("<%d>:",tot); 9 int i; 10 for(i=1;i<=r;i++) 11 printf("%d ",resl[i]); 12 printf("\n"); 13

Ka的递归编程练习 Part7|素数环!

1 #include <stdio.h> 2 #include <math.h> 3 #define MAX 12 4 int used[21]={0},resl[21]={0},zs[50]={0};//used=已使用 resl=结果 zs=质数 5 int total=0; 6 void output() 7 { 8 total++; 9 printf("<%d>:",total); 10 int i; 11 for(i=1;i<=MAX

Ka的回溯编程练习 Part6|有重复元素的排列问题

第一个问题: 有红球4个,白球3个,黄球3个,将它们排成一排共有多少种排法 #include <stdio.h> int BallsIUsed[201]; int BallsIHave[201]={0}; int total=0; int k; void op() { int i; total++; printf("%d:",total); for(i=1;i<=k;i++) { printf("%c",BallsIUsed[i]); } prin

Ka的递归编程练习 Part3|集合划分啦

1 #include<stdio.h> 2 int ss(int n,int k) 3 { 4 if(n==k||k==1) return 1; 5 return ss(n-1,k-1)+k*ss(n-1,k); 6 } 7 int main() 8 { 9 int s,n,k; 10 scanf("%d%d",&n,&k); 11 n>=k?s=ss(n,k):s=-1; 12 printf("%d",s); 13 return

Luogu P4095 [HEOI2013]Eden 的新背包问题 思维/动规

当时一直在想前缀和...多亏张队提醒... 从1到n背次包,保存每一个状态下的价值,就是不要把第一维压掉:再从n到1背一次,同样记住每种状态: 然后询问时相当于是max(前缀+后缀),当然前缀后缀中间去掉了一个应去掉的商品. #include<cstdio> #include<iostream> #define R register int using namespace std; inline int g() { R ret=0,fix=1; register char ch;

1469:数据结构:简单背包问题

本题难点:简单背包问题递归程序的理解 简单背包问题问题定义:有一个背包重量是S,有n件物品,重量分别是W0,W1...Wn-1问能否从这n件物品中选择若干件放入背包中使其重量之和正好为S 背包问题递归版本解释:其选择只有两种可能,选择一组物品中包含Wn-1 ,此时knap(s,n)的解就是knap(s - Wn-1,n-1)的解如果选择的物品中不包括Wn-1,这样knap(s,n)的解就是knap(s,n-1)的解knap(s,n) = true, 当 s=0时knap(s,n) = false