借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
输入格式:
输入为一个正整数N,即起始柱上的盘数。
输出格式:
每个操作(移动)占一行,按柱1 -> 柱2
的格式输出。
汉诺塔的非递归形式被我用递归形式给做出来了!!!
1 #include <stdio.h>
2 #include <stdlib.h>
3 void shuchu(char A, char C)
4 {
5 printf("%c -> %c\n",A,C);
6 }
7 void hn(int n,char A,char B,char C)
8 {
9 if(n==1)
10 {
11 shuchu(A,C);
12 }
13 else
14 {
15 hn(n-1,A,C,B);
16 shuchu(A,C);
17 hn(n-1,B,A,C);
18 }
19 }
20 int main()
21 {
22 int n;
23 scanf("%d",&n);
24 char A=‘a‘,B=‘b‘,C=‘c‘;
25 hn(n,A,B,C);
26 return 0;
27 }
Description
Bessie has gone to the mall‘s jewelry store and spies a charm bracelet. Of course, she‘d like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms. Each charm i in the supplied list has a weight Wi (1 ≤ Wi ≤ 400), a ‘desirability‘ factor Di (1 ≤ Di ≤ 100), and can be used at most once. Bessie can only support a charm bracelet whose weight is no more than M (1 ≤ M ≤ 12,880).
Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the maximum possible sum of ratings.
有N(1 ≤ N ≤ 3,402) 件物品和一个容量为V的背包。第i件物品的重量是w[i](1 ≤ Wi ≤ 400),价值是d[i](1 ≤ Di ≤ 100)。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量M(1 ≤ M ≤ 12,880),且价值总和最大。
我最喜欢的简单的01背包问题
1 #include<string.h>
2 #include<stdio.h>
3 int we[12881];
4 int v[3403];
5 int w[3403];
6 int main()
7 {
8 int i,j;
9 while(~scanf("%d%d",&i,&j))
10 {
11 int t=0;
12 while(t<i)
13 {
14 scanf("%d%d",w+t,v+t);
15 t++;
16 }
17 for(t=0;t<i;t++)
18 for(int l=j;l>=w[t];l--)
19 if(we[l-w[t]]+v[t]>we[l])we[l]=we[l-w[t]]+v[t];
20 printf("%d\n",we[j]);
21
22 }
23 }
现在我们有N个种类的食物,它们有不同的售价和能量. 但是Sunny手上的钱是有限的。在这个弱肉强食的世界,Sunny想要变强,因此需要能量升级,才能在这个世界上生存,为了让Sunny能够干掉更多等级低下的Boss,聪明的你帮帮Sunny怎样去获取能量?
还是俺最爱的01背包,感觉就是西邮的题目copy过来,
1 #include<string.h>
2 #include<stdio.h>
3 int we[12881];
4 int v[3403];
5 int w[3403];
6 int main()
7 {
8 int time;
9 scanf("%d",&time);
10 while(time--)
11 {
12 memset(we,0,sizeof(we));
13 int i,j,t;
14 scanf("%d%d",&i,&j);
15 t=0;
16 while(t<i)
17 {
18 scanf("%d",v+t);
19 t++;
20 }
21 t=0;
22 while(t<i)
23 {
24 scanf("%d",w+t);
25 t++;
26 }
27 for(t=0;t<i;t++)
28 for(int l=j;l>=w[t];l--)
29 if(we[l-w[t]]+v[t]>we[l])we[l]=we[l-w[t]]+v[t];
30 printf("%d\n",we[j]);
31
32 }
33 }
可怜的POIUYTREWQ最近想买下dota2的商品,但是手头缺钱。他想起了之前看过的一部大片,觉得抢银行也许是个不错的选择。他认为,坏人被抓是因为没有预先规划。于是他在之前的几个月对各大银行进行了一次评估; 评估内容包括安全性和可盗窃金额: 他想知道在在某个风险系数下可以偷窃的最大金额
Input第一行给出了一个整数T, 表示有T组测试数据. 对于每一组数据,第一行给出了一个浮点数P, 表示POIUYTREWQ允许被抓的最大概率, 和一个整数N,表示他计划去抢劫的N个银行. 接下来N行, 每行给出一个整数数Mj和浮点数Pj.
抢劫银行 j 可获得 Mj 百万美金, 被抓的概率是 Pj .Output对于每组数据,每行输出一个整数,表示POIUYTREWQ在被抓概率小于P的情况下,可抢到的最多的金钱。
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
你可以认为每家银行都是独立的。Sample Input
3
0.04 3
1 0.02
2 0.03
3 0.05
0.06 3
2 0.03
2 0.03
3 0.05
0.10 3
1 0.03
2 0.02
3 0.05
Sample Output
2
4
6
1 #include<cmath>
2 #include<cstring>
3 #include "stdio.h"
4 #include "iostream"
5 using namespace std;
6 double s[10001];
7 int va[10001];
8 double we[10001];
9 int main()
10 {
11 int time;
12 scanf("%d",&time);
13 while(time--)
14 {
15 double wei;
16 int ti;
17 int sum=0;
18 scanf("%lf%d",&wei,&ti);
19 memset(s,0,sizeof(s));
20 memset(va,0,sizeof(va));
21 memset(we,0,sizeof(we));
22 for(int i=1;i<=ti;i++)
24 scanf("%d%lf",va+i,we+i);
25 for(int i=1;i<=ti;i++)
26 sum+=va[i];
28 s[0]=1;
29 for(int i=1;i<=ti;i++)
30 {
31 for(int j=sum;j>=va[i];j--)
32 s[j]=max(s[j],s[j-va[i]]*(1.0-we[i]));
33 }
34 for(int i=sum;i>=0;i--)
35 {
36 if(wei>(1-s[i]))
37 {
38 printf("%d\n",i);
39 break;
40 }
}
46 }
47 }