[NOIP2001] 普及组

装箱问题

裸01背包,速刷过

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 int sp[50000]={0};
 6 int f[50000]={0};
 7 int main(){
 8     int v,n;
 9     cin>>v>>n;
10     int i,j;
11     for(i=1;i<=n;i++){
12         scanf("%d",&sp[i]);
13     }
14     for(i=1;i<=n;i++)
15      for(j=v;j>=sp[i];j--){
16          f[j]=max(f[j],f[j-sp[i]]+sp[i]);
17      }
18     cout<<v-f[v];
19     return 0;
20 } 
装箱问题

求先序排列

中序排列串中的任意位置都可能是根。

后序排列串的最后一位一定是树的总根。

根据这两个性质,就可以寻找根节点,并递归处理左右子树了。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 char s[10],c[10];
 9 void solve(int l,int la,int r,int ra){
10     if(l>la || r>ra)return;
11     printf("%c",c[ra]);
12     for(int i=l;i<=la;i++){
13         if(s[i]==c[ra]){
14             solve(l,i-1,r,r+i-l-1);
15             solve(i+1,la,r+i-l,ra-1);
16             break;
17         }
18     }
19     return;
20 }
21 int main(){
22     scanf("%s",s+1);
23     scanf("%s",c+1);
24     int i,j;
25     int len=strlen(s+1);
26     solve(1,len,1,len);
27     return 0;
28 }
求先序排列

数的计算

记忆化DFS

其实DP也可以

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7 const int mxn=1200;
 8 int h[mxn];
 9 int n;
10 int dfs(int x){
11     if(h[x])return h[x];
12     int i,j;
13     int res=0;
14     for(i=1;i<=x/2;i++){
15         res++;
16         res+=dfs(i);
17     }
18     if(!h[x])h[x]=res;
19     return res;
20 }
21 int main(){
22     scanf("%d",&n);
23     cout<<dfs(n)+1<<endl;
24     return 0;
25 }
数的计算
原文地址:https://www.cnblogs.com/SilverNebula/p/5962545.html