快排+歸併+揹包

快排

int Partion(int A[],int low,int high){
	int pivot = A[low];
	while(low < high){
		while(low < high && A[high] >= pivot)--high;
		A[low] = A[high];
		while(low < high && A[low] <= pivot)++low;
		A[high] = A[low];
		}
		A[low] = pivot;
		return low;
	}

void QuickSort(int A[],int low,int high){
	if(low < high){
		int pos = Partion(A,low,high);
		QuickSort(A,low,pos-1);
		QuickSort(A,pos+1,high);
	}
}

歸併

void Merge(int A[],int low,int mid,int high){
	for(i = low;i <= high;i++)B[i] = A[i];
	for(i = low,j = mid+1,k=i;i <= mid && j <= high;k++){
		if(B[i] <= B[j])A[k] = B[i++];
		else A[k] = B[j++];
	}
	while(i <= mid)A[k++] = B[i++];
	while(j <= high)A[k++] = B[j++];
}

void MergeSort(int A[],int low,int high){
	if(low < high){
		int mid = (low+high) / 2;
		MergeSort(A,low,mid);
		MergeSort(A,mid+1,high);
		Merge(A,low,mid,high);
	}
}

北大點菜

int main(){
    int c,n;
    cin >> c >> n;
    int v[n+1],p[n+1];
    for(int i = 1;i <= n;i++)cin >> p[i] >> v[i];
    int dp[n+1][c+1];
    for(int i = 0;i <= n;i++){
        dp[i][0] = 0;
    }
    for(int i = 0;i <= c;i++)dp[0][i] = 0;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= c;j++){
            if(j < p[i])dp[i][j] = dp[i-1][j];
            else dp[i][j] = max(dp[i-1][j],dp[i-1][j-p[i]]+v[i]);
        }
    }
//    for(int i = 0;i <= n;i++){
//    	for(int j = 0;j <= c;j++){
//    		cout << dp[i][j] << " ";
//		}
//		cout << endl;
//	}
	cout << dp[n][c] <<  endl;
    return 0;
}
// 40 2
// 25 30
// 10 8

八皇后

int main(){
	int b;
	while(cin >> b){
		dfs(0,b);
	}	
}

void dfs(int n,int b){
	if(n > 7){
		total++;
		if(total == b)print();
		return;
	}
	for(int i = 0;i < 8;i++){
		if(check(n,i)){
			arr[n][i] = 1;
			dfs(n+1,b);
			arr[n][i] = 0;
		}
	}
}

bool check(int m,int n){
	for(int i = 0;i < m;i++){
		if(arr[i][n] == 1)return false;
	}
	for(int i = m-1,j = n-1;i >=0 && j >= 0;i--,j--){
		if(arr[i][j] == 1)return false;
	}
//	for(int i = m+1,j = n+1;i < 8,j < 8;i++,j++){
//		if(arr[i][j] == 1)return false;
//	}
	for(int i = m-1,j = n+1;i >= 0,j < 8;i--,j++){
		if(arr[i][j] == 1)return false;
	}
//	for(int i = m+1,j = n-1;i < 8,j >= 0;i++,j--){
//		if(arr[i][j] == 1)return false;
//	}
	return true;
}

void print(){
	for(int i = 0;i < 8;i++){
		for(int j = 0;j < 8;j++){
			if(arr[i][j] == 1)cout << j+1;
		}
	}
	cout <<  endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章