摘要: 无非是把背包的性价比排序,然后加入背包即可#include<algorithm>#include<iostream>using namespace std;typedef struct Thing{ double v; double w;}Thing;Thing arr[100];int n;double w;bool cmp(Thing a,Thing b){ return a.v/a.w>b.v/b.w;}int main(){ cin>>n; cin>>W; for(int i=0;i<n;++i) cin>>arr 阅读全文
posted @ 2011-08-26 10:19 张兰云 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 把一个正数分拆:Pk(n)=P1(n-k)+P2(n-k)+...+Pk(n-k);有一个推论:Pk(n)=P(k-1)(n-1)+Pk(n-k);写出递推公式,然后做题就可以了吧 阅读全文
posted @ 2011-08-26 10:01 张兰云 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题目的大意是,给出一些单词,问能否拼接成一串,使单词字母首尾相连。例如,Sample中的:acmmalformmouse我们可以构造出:acm->malform->mouse,符合题目要求。明显,我们可以构造一个图来解决这个问题。以字母作为结点,则如果存在单词,例如acm,那么a和m就连一条边,同样,对于malform,我们就连一条环在m上。这个时候还可以统计点的出度和入度数。这是一个欧拉路问题,只要图中存在欧拉回路或者欧拉通路,都符合题目要求。关于判断一个图属否存在欧拉路或欧拉回路,有如下定理:定理 有向图G为欧拉图,当且仅当G的基图 连通,且所有顶点的入度等于出度。推论 有向图 阅读全文
posted @ 2011-07-24 19:45 张兰云 阅读(573) 评论(0) 推荐(1) 编辑
摘要: 基本思想就是用d[a][b]表示字符串1的前个字符和字符串2的前b个字符能不能组成目标字符串,若是能则赋值为1,否则复制为零,具体代码如下:经典的动态规划#include<iostream>#include<string>#include<fstream> using namespace std; //char a[201],b[201],c[401];bool dp[201][401]; void read(){// ifstream cin("in.txt"); string a,b,c; int i,j,k; int cas; ci 阅读全文
posted @ 2011-07-21 21:55 张兰云 阅读(330) 评论(1) 推荐(1) 编辑
摘要: 问题描述:有一个天平和20个砝码,砝码的重量分别为1, 3, 9, 27,...,3^19,要求合理地把其中某些砝码放到天平的两边,测量出给定物体的重量w(1<w<(3^20-1)/2),待测物体放置在天平的左侧。分析左侧砝码总重+物体重量=右侧砝码总重物体重量=右侧砝码总重-左侧砝码总重所以,问题可以转化为:给出正整数w,对3^i(0<=i<=19)加上权值s (s=-1,0或者1),使得所有项的总和为w。s=-1对应于砝码放在天平左侧,s=1对应于砝码放在天平右侧,s=0对应于不使用该砝码。列举前10项的情形如下:通过观察,这个表格和基数为3的“进位制”问题很像(如 阅读全文
posted @ 2011-06-26 21:21 张兰云 阅读(501) 评论(0) 推荐(0) 编辑
摘要: ///一个点的坐标只有四种可能,用0表示 偶数,1表示奇数 ,则四种可能为(0,0),(0,1) ///(1,0),(1,1)。观察公式A=|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|/2,仔细分析之后 ///可以得到A要为偶数,那么三个点的坐标中至少要有两个点的类型一样,这样就可以将问题的 ///复杂度降到O(1)了。 #include<stdio.h> int main() { int cas,t=1; scanf("%d",&cas); while(cas--) { printf("Scenario 阅读全文
posted @ 2011-06-24 20:08 张兰云 阅读(289) 评论(0) 推荐(1) 编辑
摘要: #include<iostream>#include<algorithm>using namespace std;//int edge[110][110];int flag[110];int p[110];struct node{ int start; int end; int cost;};node edge[10010];int cmp(const node& c,const node& d){ return c.cost<d.cost;}int FindSet(int x){ int temp=p[x]; if(x!=p[x]) p[x]=F 阅读全文
posted @ 2011-06-10 20:33 张兰云 阅读(272) 评论(0) 推荐(0) 编辑
摘要: #include "stdio.h"#include "stdlib.h"#define HASHSIZE 5struct Node{ int k; struct Node *next;};struct Node T[HASHSIZE];//初始化哈希表void InitHash(){ for(int i=0;i<HASHSIZE;i++) { T[i].k=i; T[i].next=0; }}//打印void PrintHash(){ for(int i=0;i<HASHSIZE;i++) { printf("%d:", 阅读全文
posted @ 2011-06-07 14:58 张兰云 阅读(1246) 评论(0) 推荐(2) 编辑
摘要: prim算法不仅仅可以求最小生成树,也可以求“最大生成树”。最小割集Stoer-Wagner算法就是典型的应用实例。 求解最小割集普遍采用Stoer-Wagner算法,不提供此算法证明和代码,只提供算法思路:1.min=MAXINT,固定一个顶点P2.从点P用“类似”prim的s算法扩展出“最大生成树”,记录最后扩展的顶点和最后扩展的边3.计算最后扩展到的顶点的切割值(即与此顶点相连的所有边权和),若比min小更新min4.合并最后扩展的那条边的两个端点为一个顶点(当然他们的边也要合并,这个好理解吧?)5.转到2,合并N-1次后结束6.min即为所求,输出min// 2914.cpp : 定义 阅读全文
posted @ 2011-06-05 16:42 张兰云 阅读(1204) 评论(0) 推荐(1) 编辑
摘要: 暴力搜素应该会写吧,这个。。。。#include <string.h>#include <stdio.h>int rec[8][8];int s[8];int n;int min;int max;void Bscktrack(int cout);int main(){ int i,j; while (1) { scanf("%d",&n); if (n==-1) { break; } for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { scanf("%d",&rec[i] 阅读全文
posted @ 2011-05-31 15:26 张兰云 阅读(290) 评论(0) 推荐(0) 编辑