摘要:
题意:有6种石头,价值分别是1,2,3,4,5,6 每种有若干,作为输入数据。问能否把这些石头按照价值均分?分析:多重背包问题。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 const int MAXN = 60000 + 5; 6 int dp[MAXN], n[6]; 7 int main(){ 8 int i, j, k; 9 int cas = 0;10 while(scanf("% 阅读全文
摘要:
题意:给出n枚硬币,每个硬币有自己的面值,将这些硬币均分,有时无法均分,求分出来的两份硬币的最小差值分析:统计总面值然后用总面值的一半作为背包容量,01背包。代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <math.h> 4 #include <string.h> 5 using namespace std; 6 const int MAXN = 50000; 7 const int INF = 0x3f3f3f3f; 8 #define DEBUG 9 in 阅读全文
摘要:
题意:HM先生喜欢吃汉堡,有两种汉堡,每种无限多个,吃完第一种的汉堡一个需要m时间,第二种需要n时间,HM先生饭量很大可以不停的吃,给定一个时间t,在t时间段内希望HM先生吃尽量多的汉堡,并且空余出来的时间要尽量少分析:是一个只有两种元素的完全背包问题。代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 #define DEBUG 6 const int MAXN = 10000 + 10; 7 int d 阅读全文
摘要:
题意:公园在(1,1)点,火车站在(n,m)点,你需要从公园走到火车站,前进时只能距离车站越来越近不能往回走~路上有些地方有障碍(unsafe)不能走,问总的路线有多少。简单的dp,不过dp我是写成函数而不是简答的数组,用a[i][j]=0表示可以走,a[i][j]=1表示不能走。递归调用时注意边界,不要越界。代码:View Code 1 #include <stdio.h> 2 #include <string> 3 #include <string.h> 4 #include <sstream> 5 #include <iostream 阅读全文
摘要:
经典问题了,题意我就不叙述了(题目是中文的~)分析:dp[i][j]表示在第i行第j个位置上能取得的最大和,那么要从最后一行开始算起,到塔顶结束:dp[i][j] = a[i][j]+max(dp[i+1][j], dp[i+1][j+1]), 边界条件是dp[n][j] = a[n][j];代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 #define DEBUG 5 const int MAXN = 100 + 5; 6 int a[MAXN][MAXN 阅读全文
摘要:
题意:手中的硬币币值有1,5,10,25,50共5种,给定一个面值n,问把n兑换成硬币的方案总数是多少。分析:先打表,再输入输出。动态规划的简单题目,设dp[i]表示面值为i的情况下能兑换的种类,那么dp[i]=sigma(dp[i-v[j]]), j=0..4, v[j]={1,5,10,25,50};也就是,如果i大于v[j],说明能够用dp[i-v[j]]的方案再加上一枚面值为v[j]的硬币作为面值i的方案,不过这只是方案中硬币的数量多了一枚,题目中只是问方案数量,那么此时两者在方案数量上等价,那么方案总数上加上这一种情况就可以了。代码:View Code 1 #include < 阅读全文