赞
踩
题目难易:中等
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200
示例 1:
示例 2:
提示:
这题是一个背包问题,只需要求出数组的和,将和除以2,就是背包容量,背包容量为和除以2装的元素和是否等于和除以2,这样就完成了这个题。那我们来实现一下代码。
- #include <bits/stdc++.h>
- using namespace std;
- int sum;
- int num[210];
- int dp[10010];
- int main()
- {int n;
- cin>>n;
- for(int i=0;i<n;i++)
- {
- cin>>num[i];
- sum+=num[i];//对数组求和
- }
- sum/=2;
- for(int i=0;i<n;i++)
- {
- for(int j=sum;j>=num[i];j--)
- dp[j]=max(dp[j],dp[j-num[i]]+num[i]);//求背包容量为j,是求得子集的最大值
- }
- if(dp[sum]==sum)//如果和sum相同则输出YES
- cout<<"YES";
- else
- cout<<"NO";
- return 0;
- }
题目难度:中等
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。
示例:
解释:
提示:
这道题和前面的分割等和子集相同,对数组求和,再将和除以2,对和除以2这个容量进行背包,看这个容量最大能够装多少石头,再用原来的减去这个就完成了。
- #include <bits/stdc++.h>
- using namespace std;
- int sum;
- int num[210];
- int dp[10010];
- int main()
- {int n;
- cin>>n;
- for(int i=0;i<n;i++)
- {
- cin>>num[i];
- sum+=num[i];
- }
- int coun=sum;
- sum/=2;
- for(int i=0;i<n;i++)
- {
- for(int j=sum;j>=num[i];j--)
- dp[j]=max(dp[j],dp[j-num[i]]+num[i]);
- }
- cout<<coun-dp[sum]-dp[sum];//两个子集碰撞消除
- return 0;
- }
输入一串二叉树,输出其前序遍历。
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用 *
表示
二叉树的前序遍历。
输入 #1复制
6 abc bdi cj* d** i** j**
输出 #1复制
abdicj
- #include <iostream>
- #include <bits/stdc++.h>
- using namespace std;
- struct note
- {
- char left;
- char right;
- char fa;
- }tree[150];
- void xian(char s)
- {
- cout<<s;
- if(tree[s].left!='*')
- xian(tree[s].left);
- if(tree[s].right!='*')
- xian(tree[s].right);
- }
- int main()
- {
- int n;
- cin>>n;
- char root;
- for(int i=1;i<=n;i++)
- {
- char s;
- cin>>s;
- if(i==1)
- root=s;
- cin>>tree[s].left>>tree[s].right;
- tree[tree[s].left].fa=tree[tree[s].right].fa=s;
- }
- xian(root);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。