看來還是需要好好理解背包的含義啊!本來鄙人寫了3600+的代碼,各種悲劇。果然還是對背包的理解不深啊!看過人家的代碼後才A出來.....#include<iostream>#include<string>#include<cstdio>using namespace std;int dp[111][111];int max( int a,int b ){ return a>b?a:b; }int max( int a,int b,int c ){
[題目大意]給定一個無向圖,求出這些邊(至少出現在一棵產生樹中的邊)的數目。[解題思路]理解MST的思想,將貪心思想運用。由小到大遍曆這些邊,權值相同的為一組。先判斷這些邊是否能夠成為樹邊,再對這些邊進行合并。[注意事項]不知道為何,以前一直寫的模板不頂用了...一定要改成比較醜的樣子...[Code]#include<iostream>#include<cstdio>#include<algorithm>#define FF(i,N) for( int i=
簡單DP/*ID:sevenst4;LANG:C++PROG:maze1*/#include<stdio.h>using namespace std;char m[222][88];int hi[101][40];int fx( int x ){ return (x<<1)-1; }int fy( int y ){ return (y<<1)-1; }int min( int a,int b ){ return a<b?a:b; } int main()
網路上題解很多。我就不亂說了。首先分組背包的原型:給物品分組,容量為V的背包,每個分組內的物品互斥,每個分組最多取一個物品。求最大值。代碼很簡單:for( int i=0;i<group;i++ )for( int j=V;j>=0;j-- )for( int k=0;k<total[i];k++ ) f[V]=max( f[V],f[V-cost[k]]+value[k] );背包九講裡面有,相信大家都看了。不多說。而這題,是在每個分組中最少取一種物品。so~ 不能用一維了,
並查集#include<iostream>using namespace std;#define N 30000#define G 501int p[N], group[N];int main(){ int n, g; while(scanf("%d %d", &n, &g) == 2) { if(n + g == 0) break; int i,j,k;
再做有種親切感,比SG簡單多了.... 淚奔....將同行兩棋子之間的空格數視為某堆的石子數。進行一次Nim就OK了....#include<iostream>#include<cmath>using namespace std;int main(){ int N,M; while( scanf("%d %d",&N,&M)!=EOF ) { int xo=0; int a,b; for( int i=0;i<N;i++ )