方法一:最朴素方法,不优化时间和空间
空间和时间复杂度都是O(n*s),n为奶牛数目,s为奶牛高度之和
代码:照理说,空间复杂度超过限制,但是POJ居然通过了
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int n; //# of cows
int b; //height of shelf
int h[21]; //heights of cows
int s; //sum of cow's heights
//DP
bool dp[21][20000001]; //dp[i][j]: cow[1...i] considered, whether stack height of j exists
//DP(0-1背包)
void solve(){
//DP(0-1背包) init
int i,j;
dp[0][0]=true;
for(j=1;j<=s;j++)
dp[0][j]=false;
//DP(0-1背包)
for(i=1;i<=n;i++){//依次考虑到cow[1...i]
for(j=0;j<=s;j++){
dp[i][j]=dp[i-1][j];
if(j-h[i]>=0){
dp[i][j]=dp[i][j] || dp[i-1][j-h[i]];
}
}
}
}
int main(){
//input
scanf("%d%d",&n,&b);
int i;
s=0;
for(i=1;i<=n;i++){
scanf("%d",&h[i]);
s+=h[i];
}
//DP(0-1背包)
solve();
//output
for(i=b;i<=s;i++){
if(dp[n][i]==true){
printf("%d\n",i-b);
break;
}
}
system("pause");
return 0;
}
方法二:优化空间
用一维数组代替二维数组求解DP问题时,内部循环j必须递减循环,∵
dp[i][j]=dp[i-1][j] || dp[i-1][j-h[i]],递减循环j保证在求dp[i][j]的时候dp[i-1][j-h[i]]还是修改前的值(而非修改后的值dp[i][j-h[i])!
//DP(0-1背包)
for(i=1;i<=n;i++){
for(j=s;j>=0;j--){
//dp[j]=dp[j];
if(j-h[i]>=0){
dp[j]=dp[j] || dp[j-h[i]];
}
}
}
代码:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int n;
int b;
int h[21];
int s;
//DP
bool dp[20000001]; //dp[21][20000001]
//DP(0-1背包)
void solve(){
//DP(0-1背包) init
int i,j;
dp[0]=true;
for(j=1;j<=s;j++)
dp[j]=false;
//DP(0-1背包)
for(i=1;i<=n;i++){
for(j=s;j>=0;j--){
//dp[j]=dp[j];
if(j-h[i]>=0){
dp[j]=dp[j] || dp[j-h[i]];
}
}
}
}
int main(){
//input
scanf("%d%d",&n,&b);
int i;
s=0;
for(i=1;i<=n;i++){
scanf("%d",&h[i]);
s+=h[i];
}
//DP(0-1背包)
solve();
//output
for(i=b;i<=s;i++){
if(dp[i]==true){ //if(dp[n][i]==true){
printf("%d\n",i-b);
break;
}
}
system("pause");
return 0;
}
分享到:
相关推荐
2. "POJ2002-Squares.doc":这可能是一个Microsoft Word文档,包含了详细的解题报告,可能包括问题分析、算法描述、解题步骤、运行结果和可能的优化措施等。 详细说明: 在"POJ2002-Squares"这个问题中,参赛者可能...
2. "POJ3253-POJ3253-Fence Repair【STL优先队列】.cpp":这是使用STL中的优先队列数据结构来解决题目的代码。 3. "POJ3253-POJ3253-Fence Repair【朴素思想TLE】.cpp":这个文件可能包含了没有利用优先队列,而是...
【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...
【标题】"POJ1015-Jury Compromise" 是一个编程竞赛题目,主要涉及的是动态规划(Dynamic Programming, 简称DP)的算法应用。动态规划是一种解决复杂问题的有效方法,它通过将问题分解成子问题,并存储子问题的解来...
2. "POJ3020-Antenna Placement.doc":这可能是一个Word文档,详细记录了解题过程、思路分析、算法描述以及可能的复杂度分析。文档通常包括了问题的输入输出格式、限制条件、样例测试等关键信息。 从题目“Antenna ...
《POJ 1000 - 2000 部分题目 官方分类》 编程竞赛,特别是在线判题系统(如POJ,即Problem Online Judge)中的题目,是提升编程技能和算法理解的重要途径。POJ 1000 - 2000 是一个涵盖广泛的题目区间,包含了大量的...
在0-1背包问题中,每个物品有一个固定的价值和重量,目标是在不超过背包总容量的情况下,选取价值最大的物品子集。而在多重背包问题中,每种物品可以有多个,这意味着同一个物品可以被选取多次。因此,问题的复杂性...
这是魔兽世界终极版POJ的-测试数据,找了好久才找到的。 本来想设置为0积分,但是它居然自动收费(o_ _)ノ。 看传送门:https://pan.baidu.com/s/1cCIwW8psGDASu2JdZawG3Q
1. "POJ1837-Balance.cpp":这是使用C++语言编写的源代码文件,其中包含了解决"POJ1837-Balance"问题的算法和程序。通过阅读代码,我们可以了解具体的编程实现细节,如数据结构的选择、算法流程、变量定义等。 2. ...
1. 初始化:选择图中的任意一个顶点作为初始最小生成树的一部分。 2. 建立一个空集合,将已加入最小生成树的顶点放入其中。 3. 对于图中其他未加入集合的顶点,找出与集合内顶点相连的边中权值最小的一条。 4. 将这...
1. "POJ1010-STAMPS.cpp":这是提交到POJ系统进行评测的源代码文件,采用C++语言编写。在这个文件中,程序员通常会定义解决问题的主要函数,如主函数main(),以及任何必要的辅助函数。代码会根据输入数据进行处理,...
【标题】"POJ2299-Ultra-QuickSort"是北京大学在线判题系统POJ上的一道编程题目,其主要涉及的算法是快速排序(Ultra-QuickSort)。快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用...
dp[i][j] = min(dp[i-1][j], dp[i][j-p[i]] + m[i]); ``` 这里,dp[i-1][j]表示不购买第i种裤子的最小花费,而dp[i][j-p[i]] + m[i]表示购买第i种裤子的最小花费。最终,我们寻找dp[n][k],即购买k种不同裤子的最低...
2. "POJ2503-Babelfish.doc":这可能是一个Microsoft Word文档,通常用于存储解题报告,包括问题解析、算法设计、代码解释、运行结果以及可能的优化建议等。 结合这些信息,我们可以推测"POJ2503-Babelfish"可能是...
1. **问题描述**:POJ3414题目可能描述了一个关于“Pots”的情境,比如可能涉及到水资源分配、种植管理等实际或抽象的问题,要求参赛者设计程序来处理这些问题。 2. **输入输出格式**:解题报告会详细说明程序需要...
对于此题,可能的状态转移方程可以是dp[i][j] = min(dp[i-1][k]+cost[i-1][j-k]),其中cost[i-1][k]表示前i-1个文件用k台碎纸机处理的时间。 3. **剪枝**:为了减少不必要的计算,我们可以在动态规划过程中加入剪枝...
《POJ2525-Text Formalization:深入解析TrieTree》 在计算机科学的世界里,算法和数据结构是解决问题的关键。今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie...
2. "POJ3122-Pie.doc":这可能是解题报告的文档,通常使用Microsoft Word或其他文档编辑软件创建。报告中可能包括了问题分析、算法设计、代码解释、运行结果和可能的优化措施等内容。 根据题目"Pie"的常见含义,这...
标题中的"POJ3411-Paid Roads【class】"指的是一个编程竞赛问题,源自北京大学的在线评测系统POJ(Problem Online Judge)。这个题目可能涉及到道路付费的问题,需要通过编程来解决。"class"在这里可能指的是在解决...
【标题】"POJ1003-Hangover"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这类题目通常要求参赛者编写程序来解决特定的算法问题,以此锻炼和测试编程技能及算法理解能力。 【描述...