MOOC清华《程序设计基础》第6章:橱窗插花问题(递推法)

来源:互联网 发布:萌萌猪软件系统开发 编辑:程序博客网 时间:2024/06/06 01:40

#include <iostream>using namespace std;int V = 5;int F = 3; int main(){void ToBinary(int num, int binary[]);int Count1(int binary[], int &high);//定义美感数组int beauty[V][F] = {{7,5,-21},{23,21,5},{-5,-4,-4},{-24,10,-20},{16,23,20}};//定义最大美感得分和、相应方案int best_beauty = 0, best_put = 0;//定义部分美感和数组,设定初值int partial_sum[1 << V] = {0}; //枚举0 ~ 2^V - 1 for(int i = 1; i < (1 << V); i++){//计算部分插花方案int binary[V] = {0};ToBinary(i, binary);int high;int flowers = Count1(binary, high);if(flowers > F)  //不是合法的部分方案continue; //递推部分美感和partial_sum[i] = partial_sum[i - (1 << high)] + beauty[high][flowers - 1];//测试代码//cout << "high = " << high << endl;//cout << "partial_sum[" << i << "] = " << partial_sum[i] << endl; //维护最大美感得分和、相应方案if(flowers == F && partial_sum[i] > best_beauty) {best_beauty = partial_sum[i];best_put = i;}}//输出答案cout << "最大美感得分和:" << best_beauty << endl;cout << "插花方法:";int best_binary[V] = {0};ToBinary(best_put, best_binary);for(int vase = 0, flower = 1; vase < V; vase++)if(best_binary[vase] == 1){cout << flower;flower++;}elsecout << 0;return 0;}void ToBinary(int num, int binary[]){for(int i = 0; i < V; i++){binary[i] = num & 1;num = num >> 1;}}int Count1(int binary[], int &high)  //注意:这里的取地址运算符 {int count = 0;high = -1;for(int i = 0; i < V; i++)if(binary[i] == 1){high = i;count++;}return count;}



测试代码附带运行时的结果:



阅读全文
0 0
原创粉丝点击