随笔分类 - UVA
摘要:题目大意:给你若干硬币,让你分成两份,使其绝对值之差尽量的小。很容易想到,我们需要枚举出这些硬币可能凑出的所有面值,那么,怎么去算出这些硬币可能凑出的面值就是我们需要解决的问题了。令dp[i]数组来保存是否可以凑出i的面值的结果。可以为1,否则为0.sum为这些硬币的面值之和。显然dp[0]=1,有一份一分钱都没有事肯定可以的。那么dp[sum]=1,有一份可以囊括所有的硬币。那么既然dp[0]是可以的,那么dp[0+coin[j]]也一定可以凑出来,同理dp[sum-coin[j]]也是可以的;如此推广下去,dp[coin[j]]可以,dp[coin[j]+coin[k]]也可以………………
阅读全文
摘要:这个题吧,其实对很多人来说真的是水题,但是~~我把这个题AC掉了,真的是付出了蛮大的代价的。虽然AC掉了,但是,这个方案肯定不是最好的,特别是保存路径,我开了三维的数组。思路其实很简单,就是有点象枚举,状态转移方程应该是dp[i][j]=a[i][j]+min{dp[t][i+1]}(t为与i相邻的行,相邻的话稍微处理一下就可以了)这个题目要求一定是要按字典序最小输出路径,所以说最好应该是从后往前递推的,否则麻烦就大了,我就是在这个上面吃了苦头,一开始以为无所谓的,从哪边来都可以的,后来发现问题了,就动了大手术啊,调试就太悲催了,各种BUG啊。可见,写代码之前一定要想清楚了。这道题,还是体现了
阅读全文
摘要:这个题吧,其实跟那些个硬币问题还是差不多的。但是。。本菜鸟在做的时候因为精度的问题吃到了大苦头了,这个就相当悲剧了。这个问题在代码中有具体的体现。View Code 1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int coin[12] = {0,5,10,20,50,100,200,500,1000,2000,5000,10000}; 5 long long int a[30001][12]; 6 int main() 7 { 8 int i,j,k,cent; 9 double
阅读全文
摘要:本题吧,经典的DP。本菜鸟第一次写解题报告,以前的题都没好意思写。求高手别喷。题目意思应该还是很明白的。就是一根木头,告诉你多长,要切几下,分别切在哪些个点。然后呢,切一根多长的木头,就要多少钱。然后求一个最便宜的切木有的方案。这个题目是跟白书配套的,看过那个9.4的最优矩阵链乘的话,就能够想到,其实这个题思路跟那个矩阵链乘一样的。核心的东西就是这个方程:dp(i,j)=min{dp(i,k)+dp(k,j)+c[j]-c[i]}(其中(i<k<j),k也就是切断第i个点跟第j个点之间的那段木头的那个点)最后稍注意一下边界的条件,当i+1=j的时候,就是已经切到极限的时候,dp(i
阅读全文

浙公网安备 33010602011771号