﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-心無雜念的空白-文章分类-题解-杂</title><link>http://www.cppblog.com/lshain/category/17350.html</link><description>Beyond this world...</description><language>zh-cn</language><lastBuildDate>Thu, 21 Jul 2011 13:12:28 GMT</lastBuildDate><pubDate>Thu, 21 Jul 2011 13:12:28 GMT</pubDate><ttl>60</ttl><item><title>两等长序列最佳选择问题</title><link>http://www.cppblog.com/lshain/articles/151395.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Tue, 19 Jul 2011 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151395.html</guid><description><![CDATA[<div>A[i] {ai | i-&gt;1...n};&nbsp; ai-&gt;[1, 100];<br />B[i]&nbsp;{bi | i-&gt;1...n};&nbsp;&nbsp;bi-&gt;[1, 100];<br /><br />对每个i选择A[i] 或者B[i]，使其总和与未选择的数字的总和差值最小，给出选择项. 
<p>#include&lt;cstdio&gt;</p>
<p>int A[101];<br />int B[101];<br />int sumCost;<br />int total;<br />int check[10001];<br />int pre[10001];<br />int Q[2][10001];<br />int nq;<br />int temp;<br />int n;</p>
<p>void input(int* in){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d", &amp;in[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total += in[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>void init(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(A);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(B);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumCost = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumCost += A[i] &gt; B[i] ? A[i] : B[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>void update(int i, int j, int* cost, int sel){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int I = Q[0][j] + cost[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!check[I]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[I] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[I] = Q[0][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[1][temp] = I;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>void bfs(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt;= sumCost; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[i] = -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[0][0] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nq = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 0; j &lt;= sumCost; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[j] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 0; j &lt; nq; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(i, j, A, 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(i, j, B, 1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nq = temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 0; j &lt; nq; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[0][j] = Q[1][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt;= sumCost; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; nq; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[Q[0][i]] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>void print(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int d = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int minD = total + 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int mid = -1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt;= sumCost; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(check[i]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d = total - i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d = (d &lt; i) ? (i - d) : (d - i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(d &lt; minD){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minD = d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", mid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = n - 1; i &gt;= 0; i--){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = (-1 == pre[mid]) ? 0 : pre[mid];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = (A[i] == (mid - temp)) ? 0 : 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d %d\n", i, temp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid = pre[mid];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>int main(int argc, char* argv[], char* env[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bfs();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p>
<p><br />&nbsp;</p></div><img src ="http://www.cppblog.com/lshain/aggbug/151395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-19 17:38 <a href="http://www.cppblog.com/lshain/articles/151395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>