﻿<?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++博客-I believe-随笔分类-给我启发题</title><link>http://www.cppblog.com/luyulaile/category/10547.html</link><description>I  can</description><language>zh-cn</language><lastBuildDate>Tue, 28 Jul 2009 09:04:02 GMT</lastBuildDate><pubDate>Tue, 28 Jul 2009 09:04:02 GMT</pubDate><ttl>60</ttl><item><title>joj 1868  Blocks  无敌的枚举法</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/25/91180.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 25 Jul 2009 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/25/91180.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/91180.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/25/91180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/91180.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/91180.html</trackback:ping><description><![CDATA[<pre>第一次1.3秒，第二次0.1第三次，0.0秒</pre>
<pre>#include&lt;stdio.h&gt;
void func(int i)
{
int m,n,k,j;
int temp,vmax=4*i+2;
for(m=1;m&lt;i;m++)
for(n=m;n&lt;=i;n++)
{
j=m*n;//<span style="COLOR: red">避免了三重循环</span>
<span style="COLOR: red">if(j&gt;i)
break;//能省不少时间</span>
if(i%j==0)//<span style="COLOR: red">判断是否能整除</span>
{
k=i/j;
temp=2*(k*m+k*n+j);
if(temp&lt;vmax)
vmax=temp;
}
}
printf("%d\n",vmax);
}
int main()
{
int num,n;
scanf("%d",&amp;num);
getchar();
while(num--)
{
scanf("%d",&amp;n);
getchar();
func(n);
}
//system("PAUSE");
return   0;
}
</pre>
<img src ="http://www.cppblog.com/luyulaile/aggbug/91180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-25 22:36 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/25/91180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1894 高精度除法有巧解</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/18/90440.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 18 Jul 2009 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/18/90440.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/90440.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/18/90440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/90440.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/90440.html</trackback:ping><description><![CDATA[<div class=prob_text>Given any integer 0 &lt;= n &lt;= 10000 not divisible by 2 or 5, some multiple of n is a number which in decimal notation is a sequence of 1's. How many digits are in the smallest such a multiple of n?
<h3>Sample input</h3>
<pre>3
7
9901
</pre>
<h3>Output for sample input</h3>
<pre>3
6
12
</pre>
</div>
<p><br>可以不用高精度除法，直接如下，很巧妙，不通用。<br></p>
<pre>#include &lt;stdio.h&gt;
int main()
{
int n, a, b;
while (EOF != scanf("%d", &amp;n))
{
a = 1;
b = 1;
while (a)
{
a = (a * 10 + 1) % n;
++b;
}
printf("%d\n", b);
}
}</pre>
<p>高精度除法<br>----<br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>using namespace std;<br>int a[9]={1,11,111,1111,11111,111111,1111111,11111111,111111111};<br>const int MOD=11111;<br>&nbsp; bool test(int i,int j)<br>&nbsp; {<br>&nbsp;&nbsp;if(j&lt;10)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(a[j-1]%i==0)<br>&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;int temp=0;<br>&nbsp;&nbsp;&nbsp;int k=j%5;<br>&nbsp;&nbsp;&nbsp;int p=j/5;<br>&nbsp;&nbsp;&nbsp;if(k==0)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;for(int m=1;m&lt;=p;m++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; temp*=100000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp+=MOD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp%=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;int m,f=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;for(m=1;m&lt;=p;m++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp*=100000;//由于5位5位除，应当乘上10^5;<br>&nbsp;&nbsp;&nbsp;&nbsp; temp+=MOD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp%=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(m=0;m&lt;k;m++)//最后应当乘以其后的位数乘10^n，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f*=10;<br>&nbsp;&nbsp;&nbsp;&nbsp; if((temp*f+a[k-1])%i==0)<br>&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp; }<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; //freopen("s.txt","r",stdin);<br>&nbsp; //freopen("key.txt","w",stdout);<br>&nbsp; int i;<br>&nbsp; while(cin&gt;&gt;i)<br>&nbsp; {<br>&nbsp;&nbsp;if(i==1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;'1'&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;for(int j=2;;j++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(test(i,j))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;j&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br></p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/90440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-18 17:38 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/18/90440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj  2391 words 深搜剪枝</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/05/89274.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 05 Jul 2009 04:33:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/05/89274.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89274.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/05/89274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89274.html</trackback:ping><description><![CDATA[<table cellSpacing=3 cellPadding=3 width="75%" border=1>
    <colgroup style="COLOR: red; TEXT-ALIGN: center" span=7>
    <tbody>
        <tr>
            <th height=40>Status</th>
            <th>In/Out</th>
            <th>TIME Limit</th>
            <th>MEMORY Limit</th>
            <th>Submit Times</th>
            <th>Solved Users</th>
            <th>JUDGE TYPE</th>
        </tr>
        <tr>
            <td align=middle height=40><span id=probinfo_placeholder><img height=20 src="http://acm.jlu.edu.cn/joj/images/ok0.gif" width=20></span></td>
            <td>stdin/stdout</td>
            <td>3s</td>
            <td>8192K</td>
            <td>439</td>
            <td>74</td>
            <td>Standard</td>
        </tr>
    </tbody>
</table>
<div class=prob_text>
<p>Io and Ao are playing a word game. They say a word in the dictionary by turns. The word in the dictionary only contains lowercase letters. And the end character of the former said word should be the same as the start character of the current said word. They can start the game from any word in the dictionary. Any word shouldn't be said twice. Now, we define the complexity of the game that is the sum length of all words said in the game. Give you a dictionary, can you tell me the max complexity of this word game? </p>
<h3>Input</h3>
<p>The first line contains a single positive integer n(0 &lt; n &lt;=12). Next n lines are n words in the dictionary. The length of each word will not exceed 100.</p>
<h3>Output</h3>
<p>A single integer represents the complexity of the game.</p>
<h3>Sample Input</h3>
<pre>3
joj
jlu
acm
6
cctv
redcode
lindong
we
love
programming
3
daoyuanlee
come
on
</pre>
<h3>Sample Output</h3>
<pre>6
11
10
</pre>
</div>
<p class=prob_src>
<p><em><strong>Problem Source:</strong> provided by loon</em></p>
<p><em>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>using namespace std;<br>struct S<br>{<br>&nbsp;string a;<br>&nbsp;char begin;<br>&nbsp;char end;<br>&nbsp;int length;<br>&nbsp;}s[13];<br>&nbsp;int visited[13];<br>int temp;&nbsp;<br>void search(int a,int num,int pre)<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;for(int i=0;i&lt;num;i++ )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(s[i].begin==s[pre].end&amp;&amp;visited[i]==0)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;visited[i]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;search(a+s[i].length,num,i);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(a+s[i].length&gt;temp)temp=a+s[i].length;<br>&nbsp;&nbsp;&nbsp;&nbsp;visited[i]=0;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp;&nbsp; int num;<br>&nbsp;&nbsp; while(cin&gt;&gt;num)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;temp=0;<br>&nbsp;&nbsp;for( i=0;i&lt;num;i++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cin&gt;&gt;s[i].a;<br>&nbsp;&nbsp;&nbsp;s[i].length=(s[i].a).size();<br>&nbsp;&nbsp;&nbsp;s[i].begin=(s[i].a)[0];<br>&nbsp;&nbsp;&nbsp;s[i].end=(s[i].a)[s[i].length-1];<br>&nbsp;&nbsp;&nbsp;if(s[i].length&gt;temp)<br>&nbsp;&nbsp;&nbsp;temp=s[i].length;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;for(i=0;i&lt;num;i++)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;memset(visited,0,sizeof(visited));<br>&nbsp;&nbsp;&nbsp;visited[i]=1;<br>&nbsp;&nbsp;&nbsp;search(s[i].length,num,i);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;cout&lt;&lt;temp&lt;&lt;endl;<br>&nbsp;}</em></p>
<p><em>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; } <br></em></p>
<p>以上代码超时。完全可以剪枝。<br>举个例子<br>abc<br>cbd<br>dbm<br>dbacmdp<br>我的程序一直搜啊搜，每次搜完都重新开始。比如在以a开头后，搜到c，下次再搜索时直接利用c的结果，这是深搜的特点决定的！！！<br>*************************<br>这种类似的有序搜索都可以用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; 备忘录方法*<br>************************** <br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>using namespace std;<br>int num;<br>struct S<br>{<br>&nbsp;string a;<br>&nbsp;char begin;<br>&nbsp;char end;<br>&nbsp;int length;<br>&nbsp;}s[13];<br>&nbsp;int visited[13];<br>int temp;<br>int sum[13];&nbsp;<br>int search(int pre)//&#183;&#181;&#187;&#216;&#180;&#211;pre&#181;&#227;&#210;&#212;&#186;&#243;&#181;&#196;&#215;&#220;&#181;&#196;&#214;&#181; <br>&nbsp;{<br>&nbsp;&nbsp;int j=s[pre].length,k=0;<br>&nbsp;&nbsp;for(int i=0;i&lt;num;i++ )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(s[i].begin==s[pre].end&amp;&amp;visited[i]==0&amp;&amp;i!=pre)//必须要有I！=pre<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;visited[i]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;k=search(i)+s[pre].length;<br>&nbsp;&nbsp;&nbsp;&nbsp;if(k&gt;j)j=k;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(s[i].begin==s[pre].end&amp;&amp;i!=pre)//必须要有i!=pre<br>&nbsp;&nbsp;&nbsp;&nbsp;return sum[i]+s[pre].length;//相当于备忘录，而且无需visited[i]=0;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;sum[pre]=j;<br>&nbsp;&nbsp;return j;<br>&nbsp;}<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp;freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp;&nbsp; while(cin&gt;&gt;num)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; int i,j;<br>&nbsp;&nbsp;temp=0;<br>&nbsp;&nbsp;j=0;<br>&nbsp;&nbsp;for( i=0;i&lt;num;i++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cin&gt;&gt;s[i].a;<br>&nbsp;&nbsp;&nbsp;s[i].length=(s[i].a).size();<br>&nbsp;&nbsp;&nbsp;s[i].begin=(s[i].a)[0];<br>&nbsp;&nbsp;&nbsp;s[i].end=(s[i].a)[s[i].length-1];<br>&nbsp;&nbsp;&nbsp;if(s[i].length&gt;temp)<br>&nbsp;&nbsp;&nbsp;temp=s[i].length;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;for(i=0;i&lt;num;i++)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;memset(visited,0,sizeof(visited));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(sum,0,sizeof(sum));<br>&nbsp;&nbsp;&nbsp;visited[i]=1;<br>&nbsp;&nbsp;&nbsp;j=search(i);<br>&nbsp;&nbsp;&nbsp;if(j&gt;temp)<br>&nbsp;&nbsp;&nbsp;temp=j;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;cout&lt;&lt;temp&lt;&lt;endl;<br>&nbsp;}</p>
<p>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }</p>
<p>因为I！=pre又错了几下。<br>以后debug尽量自己用眼睛看，更省时间！！！！！！！！！</p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-05 12:33 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/05/89274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1995: Energy 求连续子串使和最大</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 04 Jul 2009 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89209.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89209.html</trackback:ping><description><![CDATA[<p>Energy</p>
<hr>
<p>
<table cellSpacing=3 cellPadding=3 width="75%" border=1>
    <colgroup style="COLOR: red; TEXT-ALIGN: center" span=7>
    <tbody>
        <tr>
            <th height=40>Status</th>
            <th>In/Out</th>
            <th>TIME Limit</th>
            <th>MEMORY Limit</th>
            <th>Submit Times</th>
            <th>Solved Users</th>
            <th>JUDGE TYPE</th>
        </tr>
        <tr>
            <td align=middle height=40><span id=probinfo_placeholder><img height=20 src="http://acm.jlu.edu.cn/joj/images/ok1.gif" width=20></span></td>
            <td>stdin/stdout</td>
            <td>3s</td>
            <td>10240K</td>
            <td>717</td>
            <td>196</td>
            <td>Standard</td>
        </tr>
    </tbody>
</table>
</p>
<div class=prob_text>
<p>Mr. Jojer is a very famous chemist. He is doing a research about behavior of a group of atoms. Atoms may have different energy and energy can be positive or negative or zero, e.g. 18 or -9. Absolute value of energy can not be more than 100. Any number of continuous atoms can form an atom-group. Energy of an atom-group is defined by the sum of energy of all the atoms in the group. All the atoms form an atom-community which is a line formed by all the atoms one by one. Energy of an atom-community is defined by the greatest energy of an atom-group that can be formed by atoms in the atom-community. The problem is, given an atom-community, to calculate its energy.</p>
<h3>Input</h3>
<p>The input contains several test cases. Each test case consists of two lines describing an atom-community. The first line of each test case contains an integer N(N&lt;=1000000), the number of atoms in the atom-community. The second line of each test case contains N integers, separated by spaces, each representing energy of an atom, given in the order according to the atom-community. The last test case marks by N=-1, which you should not proceed.</p>
<h3>Output</h3>
<p>For each test case(atom-community description), print a single line containing the energy.</p>
<h3>Sample Input</h3>
<pre>5
8 0 6 4 -1
-1</pre>
<h3>Sample Output</h3>
<pre>18</pre>
</div>
<p><br>理解题意很重要，题目的意思是说 在m个中选&nbsp;&nbsp; 连续的n个atom能量值 使其最大。<br>程序中sumtemp，sum。sumtemp确定的是其左边界，sum确定其右边界。<br>sumtemp确定左边前n个数之和为负的最大的n，且第n个数显然为负，然后从n+1开始选数。<br>sum确定了右边界使其最大。<br>求和最大都可以用这种思路！！！！！！！！！！<br>举例<br>1，2，-4，4，2，-2，1，5，-6，5，-3，8，10<br>请看sumt1=1,sum=1<br>sumt2=2;sum=1+2=3;<br>sum3=sum2-4=-1;则sumtemp=0;sum不变。<br>sum4=sumtemp+4;sum&lt;sum4,sum=4;<br>sum5=sumtemp+2；sum&lt;sum5,sum=6<br>总之sum只有在sum&lt;sumtemp时才修改。sumtemp&lt;0则清0.<br>一维dp.<br>#include"stdio.h"<br>int main()<br>{<br>&nbsp;freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp;int n;<br>&nbsp;int a;<br>&nbsp;while(scanf("%ld",&amp;n),n!=-1)<br>&nbsp;{&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long long&nbsp; sum=-0x7fffffff,sumtemp=-0x7fffffff;<br>&nbsp;&nbsp; for(long i=0;i&lt;n;i++)<br>&nbsp;&nbsp; {&nbsp;<br>&nbsp;&nbsp;&nbsp; scanf("%d",&amp;a);<br>&nbsp;&nbsp;&nbsp; if(sumtemp&gt;0)<br>&nbsp;&nbsp;&nbsp;sumtemp+=a;<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;sumtemp=a;<br>&nbsp;&nbsp;&nbsp; if(sumtemp&gt;sum)<br>&nbsp;&nbsp;&nbsp;sum=sumtemp;</p>
<p>&nbsp;&nbsp; }<br>&nbsp;&nbsp; printf("%lld\n",sum);</p>
<p>&nbsp;}<br>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-04 09:27 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/04/89209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1867 squares 深搜狂剪枝，狂超时</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/03/89196.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Fri, 03 Jul 2009 15:29:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/03/89196.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89196.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/03/89196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89196.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89196.html</trackback:ping><description><![CDATA[<p>错误代码，过不了的数据14：15 10 17 16 12 1 10 20 17 19 4 5 9 5&nbsp; 可能解：(20 15 5 ),(19 17 4 ),( 17 12 10 1 ), ( 16 10 9 5 )<br>下面的代码&#8220;no&#8221;，因为(20 19 1),(17接下来凑不出来&nbsp;)<br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>#include&lt;algorithm&gt;<br>using namespace std;<br>&nbsp;int length[21];<br>&nbsp;int mark[21];<br>&nbsp;bool cmp(int x,int y)<br>{<br>&nbsp;&nbsp;&nbsp; return x&gt;y; <br>}</p>
<p><br>&nbsp; int&nbsp; dfs(int sum,int flag,int n,int time)//&#180;&#211;time&#191;&#170;&#202;&#188;&#203;&#209;&#203;&#247; <br>&nbsp; {<br>&nbsp;&nbsp;if(sum==0)return 1;<br>&nbsp;&nbsp;&nbsp; if(time&lt;n) <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int k=time;k&lt;n;k++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(mark[k]&lt;0&amp;&amp;sum-length[k]&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[k]=flag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dfs(sum-length[k],flag,n,k+1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[k]=-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;return 0;<br>&nbsp; }<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp; int num,n;<br>&nbsp;<br>&nbsp; cin&gt;&gt;num;<br>&nbsp; while(num--)<br>&nbsp; {<br>&nbsp;&nbsp;int sum=0;<br>&nbsp;&nbsp;cin&gt;&gt;n;<br>&nbsp;&nbsp;for(int k=0;k&lt;n;k++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cin&gt;&gt;length[k];<br>&nbsp;&nbsp;&nbsp;mark[k]=-1;<br>&nbsp;&nbsp;&nbsp;sum+=length[k];<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;sort(length,length+n,cmp);<br>&nbsp;&nbsp;if(sum%4!=0||length[0]&gt;sum/4)<br>&nbsp;&nbsp;cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;sum/=4;<br>&nbsp;&nbsp;&nbsp;if(dfs(sum,1,n,0))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;if(dfs(sum,2,n,0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dfs(sum,3,n,0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"yes"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br>正确的解法应当是，在一起搜索。<br>下面是一段超时的代码<br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>#include&lt;algorithm&gt;<br>using namespace std;<br>&nbsp;int length[21];<br>&nbsp;int mark[21];<br>&nbsp;int flag=0;<br>&nbsp;int target;<br>&nbsp;bool cmp(int x,int y)<br>{<br>&nbsp;&nbsp;&nbsp; return x&gt;y; <br>}</p>
<p>&nbsp; int func(int i)<br>&nbsp; {<br>&nbsp;&nbsp;while(mark[i]&gt;0)<br>&nbsp;&nbsp;i++;<br>&nbsp;&nbsp;return i;<br>&nbsp;}<br>&nbsp; void&nbsp; dfs(int sum,int n,int time,int level)//从序号为time的开始搜索 <br>&nbsp; {<br>&nbsp;&nbsp;if(flag)return ;<br>&nbsp;&nbsp;if(sum==0&amp;&amp;level==3)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;flag=1;<br>&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; if(sum==0)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;level++;<br>&nbsp;&nbsp;&nbsp;dfs(target,n,func(0),level);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; else if(time&lt;n) <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int k=time;k&lt;n;k++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(k&gt;1)<br>&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(length[k]==length[k-1]&amp;&amp;!mark[k-1])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;//显然 <br>&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; if(sum&lt;length[n-1])&nbsp; continue;//显然 <br>&nbsp;&nbsp;&nbsp;&nbsp;if(mark[k]&lt;0&amp;&amp;sum-length[k]&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[k]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(sum-length[k],n,func(k+1),level);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[k]=-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp; }<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp; int num,n;<br>&nbsp;<br>&nbsp; cin&gt;&gt;num;<br>&nbsp; while(num--)<br>&nbsp; {<br>&nbsp;&nbsp;int sum=0;<br>&nbsp;&nbsp;cin&gt;&gt;n;<br>&nbsp;&nbsp;for(int k=0;k&lt;n;k++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cin&gt;&gt;length[k];<br>&nbsp;&nbsp;&nbsp;mark[k]=-1;<br>&nbsp;&nbsp;&nbsp;sum+=length[k];<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;sort(length,length+n,cmp);<br>&nbsp;&nbsp;if(sum%4!=0||length[0]&gt;sum/4)<br>&nbsp;&nbsp;cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;sum/=4;<br>&nbsp;&nbsp;&nbsp;target=sum;<br>&nbsp;&nbsp;&nbsp;dfs(sum,n,0,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flag==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"yes"&lt;&lt;endl;<br>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br></p>
<p>上面超时就超时原因是减枝不彻底。level标记也不太好<br>决定另外炉灶,先看看别人的代码<br>#include&lt;iostream&gt;<br>#include&lt;algorithm&gt;<br>using namespace std;<br>int s[21];<br>int v[21];<br>int len;<br>int m;<br>int dfs(int cur,int num,int beg,int fin)<br>{&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;int solve(int );<br>&nbsp;if(num==1)<br>&nbsp;&nbsp;return 1;<br>&nbsp;if(cur==len)<br>&nbsp;{<br>&nbsp; return solve(num-1);<br>&nbsp;}<br>&nbsp;&nbsp; for(int i=beg;i&gt;=fin;i--)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(!v[i]&amp;&amp;cur+s[i]&lt;=len)<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; v[i]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(cur+s[i],num,i-1,fin))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp; v[i]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; return 0;<br>}</p>
<p>int solve(int edge_num)<br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; int i;<br>&nbsp; for(i=m;i&gt;=1;i--)<br>&nbsp;&nbsp; if(!v[i])<br>&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp; v[i]=1;<br>&nbsp;&nbsp;&nbsp; if(dfs( s[i],edge_num,i-1,1))<br>&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; v[i]=0;<br>&nbsp;&nbsp; }<br>&nbsp;return 0;<br>}</p>
<p>int main()<br>{<br>&nbsp;int n;<br>&nbsp;cin&gt;&gt;n;<br>&nbsp;while(n--)<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;cin&gt;&gt;m;<br>&nbsp;&nbsp;int i;<br>&nbsp;&nbsp;int sum=0;<br>&nbsp;&nbsp;for(i=1;i&lt;=m;i++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cin&gt;&gt;s[i];<br>&nbsp;&nbsp;&nbsp;sum+=s[i];<br>&nbsp;&nbsp;&nbsp;v[i]=0;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;len=sum/4;<br>&nbsp;&nbsp;if(4*len!=sum)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;sort(s+1,s+m+1);<br>&nbsp;&nbsp;if(s[m]&gt;len)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;if(solve(4))<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;"yes"&lt;&lt;endl;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;}<br>&nbsp;return 0;<br>}//剪枝还可以做得更好！！！<br>人家的solve写得好！！，结合dfs.</p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-03 23:29 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/03/89196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序偶对生成法一种表现形式</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Thu, 02 Jul 2009 08:05:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89086.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89086.html</trackback:ping><description><![CDATA[<p>Tug of War</p>
<hr>
<p>
<table cellSpacing=3 cellPadding=3 width="75%" border=1>
    <colgroup style="COLOR: red; TEXT-ALIGN: center" span=7>
    <tbody>
        <tr>
            <th height=40>Status</th>
            <th>In/Out</th>
            <th>TIME Limit</th>
            <th>MEMORY Limit</th>
            <th>Submit Times</th>
            <th>Solved Users</th>
            <th>JUDGE TYPE</th>
        </tr>
        <tr>
            <td align=middle height=40><span id=probinfo_placeholder><img height=20 src="http://acm.jlu.edu.cn/joj/images/ok1.gif" width=20></span></td>
            <td>stdin/stdout</td>
            <td>15s</td>
            <td>8192K</td>
            <td>479</td>
            <td>114</td>
            <td>Standard</td>
        </tr>
    </tbody>
</table>
</p>
<div class=prob_text>A tug of war is to be arranged at the local office picnic. For the tug of war, the picnickers must be divided into two teams. Each person must be on one team or the other; the number of people on the two teams must not differ by more than 1; the total weight of the people on each team should be as nearly equal as possible.
<p>The first line of input contains <em>n</em> the number of people at the picnic. <em>n</em> lines follow. The first line gives the weight of person 1; the second the weight of person 2; and so on. Each weight is an integer between 1 and 450. There are at most 100 people at the picnic.
<p>The input may contain several test cases.
<p>Your output will be a single line containing 2 numbers: the total weight of the people on one team, and the total weight of the people on the other team. If these numbers differ, give the lesser first.
<h3>Sample Input</h3>
<pre>3
100
90
200
</pre>
<h3>Output for Sample Input</h3>
<pre>190 200
</pre>
</div>
<p><br>利用dp思想 ，n为偶数时求出s(n,n/2)，n为奇数时 也是s(2n,n/2)，和sum/2最接近的那个。非常经典的思路。<br>S(k, 1) = {A[i] | 1&lt;= i &lt;= k}<br>S(k, k) = {A[1]+A[2]+&#8230;+A[k]}<br>S(k, i) = S(k-1, i) U {A[k] + x | x属于S(k-1, i-1) }<br>//一下代码只能用于sum特别小的情况，否则会超时！！！！！！！！！！！<br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>#define MAX 101 <br>#define min(a,b) ((a)&lt;(b) ? (a) : (b))<br>using namespace std;</p>
<p>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp; int num;<br>&nbsp; int a[MAX],i,j,k,l,m,NUM;<br>&nbsp; bool s[MAX][2500];<br>&nbsp; while(cin&gt;&gt;num)<br>&nbsp; {<br>&nbsp;&nbsp;int sum=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=num;i++)<br>&nbsp;&nbsp; {<br>&nbsp; cin&gt;&gt;a[i];<br>&nbsp; sum+=a[i];&nbsp;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; if(num%2==0)NUM=num/2;<br>&nbsp;&nbsp; else NUM=num/2+1;</p>
<p>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;=num;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;=sum/2;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s[i][j]=false;//表示取i个物品能否达到重量是j. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; s[0][0]=true;<br>&nbsp;&nbsp; for(k=1;k&lt;=num;k++)//必须在最外层，元素不能重复 <br>&nbsp;&nbsp; for(j=min(k,NUM);j&gt;=1; j--)//递减的结果是使得不会出现在同一层次的互为因果 、、、、、、、、、、、巧妙的实现了课本上的序偶对生成法。<br>&nbsp;&nbsp; for(i=a[k];i&lt;=sum/2;i++)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;if(s[j-1][i-a[k]])<br>&nbsp;&nbsp;s[j][i]=true;<br>&nbsp;}<br>&nbsp;<br>&nbsp;for(i=sum/2; i&gt;=0; i--) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(s[NUM][i]) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;i&lt;&lt;" "&lt;&lt;sum-i&lt;&lt;endl;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>}&nbsp; </p>
<p>&nbsp; }<br>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br>下一次实现一个序偶生成法。</p>
<p>#include &lt;iostream&gt;<br>#include &lt;functional&gt;<br>using namespace std;</p>
<p>int a[101];<br>bool b[101][45002];</p>
<p>int main(){<br>//&nbsp;freopen("s.txt","r",stdin);<br>//&nbsp; freopen("key.txt","w",stdout);<br>&nbsp;&nbsp;&nbsp; int N,M,i,j,k;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;N)!=EOF){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[0]=M=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=N;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",a+i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M+=a[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[0][0]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=1;k&lt;=N;k++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=N/2;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=M/2;j&gt;=0;j--){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i-1][j]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[i][j+a[k]]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=M/2,j=M/2+1;i&gt;=0;i--,j++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[N/2][i]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d %d\n",i,M-i);<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;&nbsp;&nbsp; if(b[N/2][j]){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d %d\n",M-j,j);<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; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-02 16:05 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/02/89086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 2250  my friends深度优先搜索讲解</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/29/88782.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Mon, 29 Jun 2009 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/29/88782.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88782.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/29/88782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88782.html</trackback:ping><description><![CDATA[I have my friends to visit. For some reason, I can only visit some of my friends. So I want see my friends as many as possible. Thus I must choose the longest way. Your goal is to help me developing a program that computes the length of the longest path that can be constructed in a given graph from a given starting point (My residence). You can assume that the graph has no cycles (there is no path from any node to itself), so I will reach my destination in a finite time. In the same line of reasoning, nodes are not considered directly connected to themselves.
<h3>Input</h3>
The input consists of a number of cases. The first line on each case contains a positive number n (1 &lt; n &lt;= 100) that specifies the number of points in the graph. A value of n = 0 indicates the end of the input. After this, a second number s is provided, indicating the starting point in my journey (1 &lt;= s &lt;= n). Then, you are given a list of pairs of places p and q, one pair per line. The pair "p q" indicates that I can visit q after p. A pair of zeros ("0 0") indicates the end of the case. As mentioned before, you can assume that the graphs provided will not be cyclic.
<h3>Output</h3>
For each test case you have to find the length of the longest path that begins at the starting place. You also have to print the number of the final place of such longest path. If there are several paths of maximum length, print the final place with smallest number.
<p>Print a new line after each test case.
<h3>Sample Input</h3>
<pre>2
1
1 2
0 0
5
3
1 2
3 5
3 1
2 4
4 5
0 0
5
5
5 1
5 2
5 3
5 4
4 1
4 2
0 0
0
</pre>
<h3>Sample Output</h3>
<pre>Case 1: The longest path from 1 has length 1, finishing at 2.
Case 2: The longest path from 3 has length 4, finishing at 5.
Case 3: The longest path from 5 has length 2, finishing at 1.</pre>
<pre>提交了10次，AC 3次，超时4次，wa 3次。</pre>
<pre>很无语。</pre>
<pre>应该是动态规划最好，但是我不是很熟，用了搜索。以下是超时的代码</pre>
<pre>
<pre>#include&lt;iostream&gt;
#include&lt;cstdlib&gt;
using namespace std;
int path[101][101];
int mark[101];
int len[101];//
int end[101];
int dfs(int start,int num)//返回从当前点出发的最大长度
{
if(mark[start]==1)return len[start];
mark[start]=1;
end[start]=start;
for(int i=1;i&lt;=num;i++)
{
if(path[start][i])
{
if(len[start]&lt;dfs(i,num)+1)
{
len[start]=len[i]+1;
end[start]=end[i];
}
else
if(len[start]==len[i]+1&amp;&amp;end[start]&gt;end[i])
end[start]=end[i];
}
}
<span style="COLOR: red">mark[start]=0;//这句坚决不需要 </span>
return len[start];
}
int main()
{
// freopen("s.txt","r",stdin);
//freopen("key.txt","w",stdout);
int j,k,turn=0;
int start,num;
while(cin&gt;&gt;num)
{
turn++;
if(num==0)break;
memset(path,0,sizeof(path));
memset(mark,0,sizeof(mark));
memset(len,0,sizeof(len));
memset(end,0,sizeof(end));
cin&gt;&gt;start;
while(cin&gt;&gt;j&gt;&gt;k)
{
if(j==0)break;
path[j][k]=1;
}
cout&lt;&lt;"Case "&lt;&lt;turn&lt;&lt;": The longest path from "&lt;&lt;start&lt;&lt;" has length "&lt;&lt;dfs(start,num)&lt;&lt;", finishing at "&lt;&lt;end[start]&lt;&lt;"."&lt;&lt;endl&lt;&lt;endl;
}
//system("PAUSE");
return   0;
}</pre>
<pre>以下是ac的代码</pre>
<pre>
<pre>#include&lt;iostream&gt;
#include&lt;cstdlib&gt;
using namespace std;
int path[102][102];
int mark[102], len[102],end[102];
int dfs(int start,int num)//返回从当前点出发的最大长度
{
if(mark[start]==1)return len[start];
mark[start]=1;
end[start]=start;
len[start]=0;
int i,t;
for( i=1;i&lt;=num;i++)
{
if(path[start][i])
{
t=dfs(i,num)+1;
if(t&gt;len[start])
{
len[start]=t;
end[start]=end[i];
}
else
if(len[start]==t)
{
if(end[start]&gt;end[i])
end[start]=end[i];
}
}
}
return len[start];
}
int main()
{
//freopen("s.txt","r",stdin);
//freopen("key.txt","w",stdout);
int j,k,turn=0;
int start,num;
while(cin&gt;&gt;num,num)
{
turn++;
memset(path,0,sizeof(path));
memset(mark,0,sizeof(mark));
memset(len,0,sizeof(len));
memset(end,0,sizeof(end));
cin&gt;&gt;start;
while(cin&gt;&gt;j&gt;&gt;k,j||k)
{
path[j][k]=1;
}
dfs(start,num);
cout&lt;&lt;"Case "&lt;&lt;turn&lt;&lt;": The longest path from "&lt;&lt;start&lt;&lt;" has length "&lt;&lt;len[start]&lt;&lt;", finishing at "&lt;&lt;end[start]&lt;&lt;"."&lt;&lt;endl&lt;&lt;endl;
}
//system("PAUSE");
return   0;
}</pre>
<pre>不妨执行一下</pre>
<pre style="COLOR: #ff0000"><span style="COLOR: #000000">5
3
1 2
3 5
3 1
2 4
4 5
0 0
先是len[3]=0;end[3]=3;flag[3]=1;</span></pre>
<pre>再执行t=dfs(1)+1,</pre>
<pre>转入dfs（1）；len[1]=0;end[1]=1;flag[1]=1;</pre>
<pre>再执行<span style="COLOR: #0000ff">t=dfs(2)+1;</span></pre>
<pre>转入dfs(2),len[2]=0;end[2]=2;flag[2]=1;</pre>
<pre><span style="COLOR: #00ff00">再执行t=dfs(4)+1<br></span>转入dfs(4),len[4]=0;end[4]=4;flag[4]=1;</pre>
<pre>再转入<span style="COLOR: red">t=dfs（5)+1;<br></span>转入dfs(5),len[5]=0;end[5]=5;flag[5]=1;return(len[5]=0);</pre>
<pre style="COLOR: red">则t=1;t&gt;len[4];len[4]=1;end[4]=end[5]=5;再看4没了其他相邻元素。dfs(4)=return(len[4])=1;</pre>
<pre style="COLOR: red"><span style="COLOR: #00ff00">t=dfs(4)+1=2;len[2]=t=2;end[2]=end[4]=5;再看2没了其他相邻元素，dfs(2)=return(len(2)=2;<br><span style="COLOR: #0000ff">再看t=dfs(2)+1=3;len[1]=t=3;end[1]=en[2]=5;再看1有没有其他相邻元素，dfs(1)=return(len(1)=3<br><strong>再执行t=dfs(1)+1,len[3]=4;end[3]=end[1]=5;再看3有没有其他相邻元素，有dfs(5),已经遍历到了，所以dfs（5）return len【5】。<br>没有影响。<br>假设改为<br></strong><span style="COLOR: #000000">5
3
5 2
3 5
3 1
2 4
4 1
0 0
执行时会走3-&gt;1&gt;这时的1结点len[1]已经求的   3&gt;5&gt;2&gt;4&gt;1len[1]已知了</span></span></span></pre>
</pre>
</pre>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-29 16:13 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/29/88782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 2173 有点启发，double运算速度比Int快</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/29/88756.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Mon, 29 Jun 2009 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/29/88756.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88756.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/29/88756.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88756.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88756.html</trackback:ping><description><![CDATA[<p>启发1，double运算速度比Int快<br>启发2，m选N的组合数，如果n已知，只需循环即可<br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>using namespace std;<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; //freopen("s.txt","r",stdin);<br>&nbsp; //freopen("key.txt","w",stdout);<br>&nbsp; double n[1001];<br>&nbsp; int i,j,k,m;<br>&nbsp; int flag,num;<br>&nbsp; while(cin&gt;&gt;num,num)<br>&nbsp; {<br>&nbsp;&nbsp;flag=0;<br>&nbsp;&nbsp;for(m=1;m&lt;=num;m++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;cin&gt;&gt;n[m];<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;for(i=1;i&lt;=num;i++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=num;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=1;k&lt;=num;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(n[i]+n[j]+n[k]==0)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;flag=1;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flag==1)break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;if(flag==1)break;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp;if(flag==1)cout&lt;&lt;"yes"&lt;&lt;endl;<br>&nbsp;&nbsp;else cout&lt;&lt;"no"&lt;&lt;endl;<br>&nbsp;}</p>
<p>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }</p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-29 11:44 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/29/88756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 2308 Problems to Solve很巧啊</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/28/88729.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 28 Jun 2009 14:26:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/28/88729.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88729.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/28/88729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88729.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88729.html</trackback:ping><description><![CDATA[<pre>
<pre>
<pre>
<div class=prob_text>
<p>Your teacher has given you some problems to solve. You must first solve problem 0. After solving each problem i, you must either move on to problem i+1 or skip ahead to problem i+2. You are not allowed to skip more than one problem. For example, {0, 2, 3, 5} is a valid order, but {0, 2, 4, 7} is not because the skip from 4 to 7 is too long.</p>
<p>You are given N integers, where the ith integer indicates how much you like problem i. The teacher will let you stop solving problems once the range of pleasantness you've encountered reaches a certain threshold. Specifically, you may stop once the difference between the maximum and minimum pleasantness of the problems you've solved is greater than or equal to a integer K. If this never happens, you must solve all the problems.</p>
<h3>Input</h3>
The input contains several test cases. For each case it contains two positive integer N, K (1&lt;=N&lt;=50, 1&lt;=K&lt;=1000), then N integers follow in the next line, the ith integer ( &gt;=1 and &lt;= 1000 ) indicates how much you like problem i.<br>
<h3>Output</h3>
<p>For each test case, output the minimum number of problems you must solve to satisfy the teacher's requirements.</p>
<h3>Sample Input</h3>
3 2<br>1 2 3<br>5 4<br>1 2 3 4 5
<h3>Sample Output</h3>
2<br>3 </div>
</pre>
<pre>很笨但是很实用！</pre>
<pre>#include&lt;stdio.h&gt;
int a[51];
int main()
{
int n,k;
while(scanf("%d%d",&amp;n,&amp;k)!=EOF)
{
int i,j;
for(i=0;i&lt;n;i++)
scanf("%d",a+i);
int min=0xfffffff;
int flag=0;
for(i=1;i&lt;n;i++)
for(j=0;j&lt;i;j++)
{
if(a[i]-a[j]&gt;=k||a[j]-a[i]&gt;=k)
{
flag=1;
int step;
if(j==0)
{
step=(i+1)/2+1;
if(min&gt;step)
min=step;
}
else
{
step=(i-j+1)/2+(j+1)/2+1;
if(min&gt;step)
min=step;
}
}
}
if(flag)
printf("%d\n",min);
else
printf("%d\n",n);
}
return 0;
}</pre>
</pre>
</pre>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-28 22:26 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/28/88729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算n！的位数，非常巧妙啊！！</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/28/88700.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 28 Jun 2009 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/28/88700.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88700.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/28/88700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88700.html</trackback:ping><description><![CDATA[<pre>#include&lt;iostream&gt;
#include&lt;cmath&gt;
using namespace std;
int main()
{
int n;
double i;
long  double sum;
int sum2;
while(cin&gt;&gt;n,n)
{
sum=1.0;
for(i=1.0;i&lt;=n;i++)
sum+=log10(i);
sum2=sum;
printf("%d\n",sum2);
}
return 0;
}</pre>
<pre>将乘法转化为log加法！！！</pre>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-28 17:22 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/28/88700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1026 动态规划，生成函数及改进</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 27 Jun 2009 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88628.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88628.html</trackback:ping><description><![CDATA[<div class=prob_text>
<p>One curious child has a set of N little bricks. From these bricks he builds different staircases. Staircase consists of steps of different sizes in a strictly descending order. It is not allowed for staircase to have steps equal sizes. Every staircase consists of at least two steps and each step contains at least one brick. Picture gives examples of staircase for N=11 and N=5:</p>
<p align=center><img height=163 src="http://acm.jlu.edu.cn/joj/images/problems/1026.gif" width=623> </p>
<p align=left>Your task is to write a program that reads from input numbers N and writes to output numbers Q - amount of different staircases that can be built from exactly N bricks.</p>
<br>
<h3>Input</h3>
Numbers N, one on each line. You can assume N is between 3 and 500, both inclusive. A number 0 indicates the end of input.
<p>&#160;</p>
<p>&#160;</p>
<br>
<h3>Output</h3>
Numbers Q, one on each line.
<p>&#160;</p>
<br>
<h3>Sample Input</h3>
<pre>3
5
0
</pre>
<h3>Sample Output</h3>
<pre>1
2
</pre>
方法1，动态规划<br><br>#include&lt;iostream&gt;<br>#include&lt;cstdlib&gt;<br>using namespace std;<br>&nbsp; int main()<br>&nbsp; {<br>&nbsp; freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout);<br>&nbsp; double f[501][501]={0};<br>&nbsp; double s;<br>&nbsp; int i,j,k,n;<br>&nbsp; for(i=3;i&lt;=500;i++)<br>&nbsp; for(j=1;j&lt;=(i-1)/2;j++)<br>&nbsp;&nbsp;&nbsp; f[i][j]=1;<br>&nbsp; for(i=3;i&lt;=500;i++)<br>&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=(i-1)/2;j++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;for(k=j+1;k&lt;=(i-j-1)/2;k++)<br>&nbsp;&nbsp; f[i][j]=f[i-j][k];&nbsp;<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n),n) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s=0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=(n-1)/2;i++) s+=f[n][i]; //f[n]=f[n][1]+f[n][2]+-----+f[n][floor((i-1)/2)]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.0f\n",s); <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp; //system("PAUSE");<br>&nbsp; return&nbsp;&nbsp; 0;<br>&nbsp; }<br>更妙的方法：生成函数法<br>计算(1+x)(1+x^2)(1+x^3)-----,x^n的系数即为所求<br>int i,j;<br>double ans[510]={1,1};//已经把ans[1]和ans[0]赋为1了，其余为0<br>&nbsp;for(i=2;i&lt;=500;i++) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=500;j&gt;=0;j--) {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i+j&lt;=500) ans[i+j]+=ans[j]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; <br><br>先计算(1+x)(1+x^2)<br>再计算(1+x)(1+x^2)&nbsp;&nbsp; *(1+x^3)<br></div>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-27 10:44 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/27/88628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>map经典用法+多个空格隔开的case 获取行字符串</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/27/88622.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sat, 27 Jun 2009 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/27/88622.html</guid><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">map</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("s.txt","r",stdin);<br>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("key.txt","w",stdout);&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;g</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(getline(cin,s))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(g)&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(s</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[s]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getline(cin,s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout.flags(ios::</span><span style="COLOR: #0000ff">fixed</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout.precision(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a.begin();p</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">a.end();p</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">first</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">100.0</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">second</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sum</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span></div>
<p>#include&lt;iostream&gt;<br>#include&lt;string&gt;<br>#include&lt;map&gt;<br>using namespace std;</p>
<p>int main()<br>{<br>&nbsp;freopen("s.txt","r",stdin);<br>&nbsp; freopen("key.txt","w",stdout); <br>&nbsp;&nbsp;&nbsp; string s;<br>&nbsp;&nbsp;&nbsp; int g=0;<br>&nbsp;&nbsp;&nbsp;<span style="COLOR: red"> while(getline(cin,s))<br></span>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (g) cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sum=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;string,int&gt; a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red"> while(s!="")<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[s]++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red">getline(cin,s);<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout.flags(ios::fixed);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout.precision(4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (<span style="COLOR: red">map&lt;string,int&gt;::iterator p</span>=a.begin();p!=a.end();p++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;p-&gt;first&lt;&lt;" "&lt;&lt;100.0*p-&gt;second/sum&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-27 09:05 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/27/88622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1197 &amp;&amp;poj 1564 Sum It Up,很巧妙处理有重复的深搜剪枝</title><link>http://www.cppblog.com/luyulaile/archive/2009/05/14/82965.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Thu, 14 May 2009 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/05/14/82965.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/82965.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/05/14/82965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/82965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/82965.html</trackback:ping><description><![CDATA[Sum It Up
<hr>
<table cellSpacing=3 cellPadding=3 width="75%" border=1>
    <colgroup style="COLOR: red; TEXT-ALIGN: center" span=7>
    <tbody>
        <tr>
            <th height=40>Status</th>
            <th>In/Out</th>
            <th>TIME Limit</th>
            <th>MEMORY Limit</th>
            <th>Submit Times</th>
            <th>Solved Users</th>
            <th>JUDGE TYPE</th>
        </tr>
        <tr>
            <td align=middle height=40><span id=probinfo_placeholder><img height=20 src="http://acm.jlu.edu.cn/joj/images/ok1.gif" width=20></span></td>
            <td>stdin/stdout</td>
            <td>3s</td>
            <td>8192K</td>
            <td>424</td>
            <td>182</td>
            <td>Standard</td>
        </tr>
    </tbody>
</table>
<div class=prob_text>
<p>Given a specifie d total <em>t</em> and a list of <em>n</em> integers, find all distinct sums using numbers from the list that add up to <em>t</em>. For example, if <em>t</em> = 4, <em>n</em> = 6, and the list is [4, 3, 2, 2, 1, 1], then there are four different sums that equal 4: 4, 3+1, 2+2, and 2+1+1. (A number can be used within a sum as many times as it appears in the list, and a single number counts as a sum.) Your job is to solve this problem in general. </p>
<p>
<h3>Input</h3>
<p>The input file will contain one or more test cases, one per line. Each test case contains <em>t</em>, the total, followed by <em>n</em>, the number of integers in the list, followed by <em>n</em> integers <img height=30 src="http://acm.jlu.edu.cn/joj/images/problems/1197.gif" width=80 align=middle border=0>. If <em>n</em> = 0 it signals the end of the input; otherwise, <em>t</em> will be a positive integer less than 1000, <em>n</em> will be an integer between 1 and 12 (inclusive), and <img height=30 src="http://acm.jlu.edu.cn/joj/images/problems/1197.gif" width=80 align=middle border=0> will be positive integers less than 100. All numbers will be separated by exactly one space. The numbers in each list appear in nonincreasing order, and there may be repetitions. </p>
<p>
<h3>Output</h3>
<p>For each test case, first output a line containing `<tt>Sums of </tt>', the total, and a colon. Then output each sum, one per line; if there are no sums, output the line `<tt>NONE</tt>'. The numbers within each sum must appear in nonincreasing order. A number may be repeated in the sum as many times as it was repeated in the original list. The sums themselves must be sorted in decreasing order based on the numbers appearing in the sum. In other words, the sums must be sorted by their first number; sums with the same first number must be sorted by their second number; sums with the same first two numbers must be sorted by their third number; and so on. Within each test case, all sums must be distinct; the same sum cannot appear twice. </p>
<p>
<h3>Sample Input</h3>
<pre>4 6 4 3 2 2 1 1
5 3 2 1 1
400 12 50 50 50 50 50 50 25 25 25 25 25 25
0 0
</pre>
<p>
<h3>Sample Output</h3>
<pre>Sums of 4:
4
3+1
2+2
2+1+1
Sums of 5:
NONE
Sums of 400:
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25
<br></pre>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdlib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">memory</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mount;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;l;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mark;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;output()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;mark</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;temp[</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;flag</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mount;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a[i][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(flag</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">a[i][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;dfs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sum,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nowv,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;pre)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(nowv</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">sum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">pre</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mount;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[j][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(nowv</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">sum</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">l)<br>&nbsp;&nbsp;&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;&nbsp;a[j][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;dfs(sum,nowv</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">value,j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pre</span><span style="COLOR: #000000">!=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[pre][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("s.txt","r",stdin);<br>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("key.txt","w",stdout);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sum,i,j;<br>&nbsp;&nbsp;cin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">sum</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">mount;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(sum</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mount;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">a[i][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;mark</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;l</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Sums&nbsp;of&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">sum</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;dfs(sum,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(mark</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">NONE</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">sum</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">mount;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">system("PAUSE");</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;}<br></span></div>
<p>&nbsp;</p>
难点：1，有序递减，这个好处理，只需在向前推时dfs(i)for(int j=i+1...)即可<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，去掉无效的重复搜索，这个烦一点,比如和为11时，序列为6,6,6,2,2,2,1，6+2+2+1显然是可以的，但是6+6不可以。6+6+6更不可以<br>我们可以这样想，如果顺着往前推是，如果不超过范围，比如6+2+取后一个数时，2可以取，但是6+6，超过11，要回溯的时候，记录下此时的6，用下面的代码<br><br>if(pre!=-1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l=a[pre][0];<br><br>在比较if(nowv+value&lt;=sum&amp;&amp;value!=l)此时不符合，下一个6取不到了！避免了重复。</div>
<img src ="http://www.cppblog.com/luyulaile/aggbug/82965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-05-14 16:32 <a href="http://www.cppblog.com/luyulaile/archive/2009/05/14/82965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>