摘要: #include<stdio.h>#include<string.h>#define MAX 9999999#define N 205int map[N][N];int vis[N];int d[N];int start,end,n,m;//n个村庄,m条路径void init(){ memset(map,MAX,sizeof(map)); memset(vis,0,sizeof(vis)); memset(d,MAX,sizeof(d));}void dijkstra(int s,int e){ int i,k,j,min; vis[s]=1; for(i=0;i&l 阅读全文
posted @ 2012-07-21 16:03 xxx0624 阅读(316) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#define N 100+5#define MAX 9999int map[N][N];int d[N];int n,ans;void prim(){ int i,j,k,min; for(i=1;i<=n;i++) d[i]=map[1][i]; ans+=d[1]; d[1]=0;//进入最小生成树 for(i=1;i<=n;i++){ min=MAX; for(j=1;j<=n;j++){ if(min>d[j]&&d[j]!=0){ k=j; min= 阅读全文
posted @ 2012-07-21 16:00 xxx0624 阅读(392) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>int fmax(int i,int j){ return i>j?i:j;}int main(){ int s1,s2,s3,s4,s5,s6; int sum,tp,tp2; while(scanf("%d%d%d%d%d%d",&s1,&s2,&s3,&s4,&s5,&s6),s1+s2+s3+s4+s5+s6){ sum=0; sum+=s6;//6*6的箱子; //s6=0; sum+=s5;//5*5的箱子,剩下的用1*1来填充 //s5=0; s1=fmax(0 阅读全文
posted @ 2012-07-21 12:44 xxx0624 阅读(597) 评论(0) 推荐(0) 编辑
摘要: 详见(http://www.darkswordzone.com/?p=749)对于一个正整数n的划分,就是把n表示成一系列正整数的和,划分与次序无关。如一个正整数5,可以划分为:[5][4,1][3,2] [3,1,1][2,2,1] [2,1,1,1][1,1,1,1,1]将一个正整数n划分,共有多少种划分方式?上面的例子第一行,所有加数不超过5;第二行,所有加数不超过4;。。。。。。。第五行,所有加数不超过1.定义int fun(int n,int m)表示正整数n,所有加数不超过m的划分数目。那么1,n==1或m==1 时共有1种划分方式。2,n==m时 fun(n,m)=fun(n,m 阅读全文
posted @ 2012-07-21 10:23 xxx0624 阅读(848) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#define N 100000+5int step,mod,seed;int flag;int f[N];int main(){ int i,j,k; while(scanf("%d%d",&step,&mod)==2){ for(i=0;i<=mod-1;i++) f[i]=0; seed=0; do { seed=(seed+step)%mod; f[seed]=1; }while(seed!=0); flag=0; for(i=0;i<=mod- 阅读全文
posted @ 2012-07-21 10:04 xxx0624 阅读(258) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>int n,side;//numint stick[270];bool vis[270];int ok;int cmp(const void *a,const void *b){ return *(int *)b-*(int *)a;}void DFS(int num,int len,int s){ int i; if(num==3){ ok=1; return; } if(ok==1)return; for(i=s;i<n;i++){ if(vi 阅读全文
posted @ 2012-07-19 14:01 xxx0624 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。 注意f[i][v]有意义当且仅当存在一个前i件物品的子集,其费用总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0..V]的最大值。如果将状态的定义中的“恰 阅读全文
posted @ 2012-07-18 20:59 xxx0624 阅读(215) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>//#define INF 99999#define N 1000+10int path[N][N];int vis[N];int start[N];int sum[N];//第i个农场最多有几头牛能到达int k,n,m;//k头牛;n个牧场(出发点);m条路void dfs(int s){ int i; sum[s]++; vis[s]=1; for(i=1;i<=n;i++){ if(path[s][i]==1&&vis[i]==0) dfs(i); } return ;} 阅读全文
posted @ 2012-07-17 15:38 xxx0624 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 简而言之就是一个人手中有num张牌,然后拿出一张,再看看剩下的牌中有没有比它大的,有的话就ans+1,也就是输了一局;AC代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 1005int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int p1[N],p2[N];bool vis[N];int num,sum,ans;int peo;//peopleint main(){ int i,j,k,cou 阅读全文
posted @ 2012-07-16 11:08 xxx0624 阅读(478) 评论(0) 推荐(0) 编辑
摘要: 此题讲的是N个人过河,每个人都有自己的过河时间,一条船只能承受2个人,所用时间为其中过河时间最多的,所以呢,想到有两种情况,第一种:过河时间最少的人来回接送其他人,第二种:过河时间最少和次少的人来回接送其他人,刚开始就觉得第一种时间必然是最少的,但是仔细想想,不然。因为第一种情况虽然单次过河时间少,但送人的次数要多,如第1个人(过河时间最少)接送第i人 dp[i]=dp[i-1]+time[0]+time[i]; 而第二种情况呢,虽然来回次数多,但是接送的人要多,如第1个人接第i-1个和第i个人,然后让第i-1个和第i个人一块过河,第2个人再接送第1个人。dp[i]=dp[i-2]+time[ 阅读全文
posted @ 2012-07-16 10:14 xxx0624 阅读(1223) 评论(2) 推荐(0) 编辑