zoj3158

 

对于每一行 ,都要从某一位置分成两段 ,由于不能切出0长度的一段,所 以有n - 1个选择 ,一共m行 ,就是(n - 1)m种方案 。由于问题的规模很 小 ,暴力枚举所有情况取最优解就可以了。直接用dfs即可。

 

#include <iostream> #include <cstdlib> #include <string> #include <cctype> using namespace std; const int MAXSIZE = 8; long nutrition[MAXSIZE][MAXSIZE]; int m, n; long mindiff = -1; void dfs(int i, int j, long sumleft, long sumright){ if(i == m){ int sum = 0; if(sumleft - sumright > 0){ sum = sumleft - sumright ; }else{ sum = sumright - sumleft; } if(sum < mindiff || mindiff == -1){ mindiff = sum; } //cout << "left: " << sumleft << endl; // cout << "right: " << sumright << endl; return ; } for(int k = 1; k < n; k++){ long tleft = 0; long tright = 0; for(int s = 0; s < k; s++) tleft += nutrition[i][s]; for(int s = k; s < n; s++) tright += nutrition[i][s]; dfs(i + 1, k, sumleft + tleft, sumright + tright); } } int main(){ while(cin >> m >> n){ for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cin >> nutrition[i][j]; } } int t; cin >> t; mindiff = -1; for(int i = 1; i < n; i++){ long sumleft = 0; long sumright = 0; for(int j = 0; j < i; j++) sumleft += nutrition[0][j]; for(int j = i; j < n; j++) sumright += nutrition[0][j]; dfs(1, i, sumleft, sumright); } if(mindiff <= t && n != 1 && mindiff != -1) cout << mindiff << endl; else cout << "You'd better buy another one!" << endl; } }

转载于:https://www.cnblogs.com/secbook/archive/2009/09/03/2655253.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值