题目来源于此大神: http://blog.csdn.net/tobewhatyouwanttobe/article/details/42805225
我是按照该blog来入门dp相关问题的。不断更新中。。。。。。2019/2/25
具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
#include
int main(){
int N;
int num;
scanf("%d",&N);
for(int i=0;imax2?max1:max2;
} //非边界值取路径相加最大的那个
cnt++;
}
}
int max = matrix[(--cnt)];
// printf("%d %d ",cnt,num);
for(int max_i = 1;max_i matrix[cnt-max_i] ? max:matrix[cnt-max_i]; //获得最大值
}
printf("%d\n",max);
}
return 0;
}
结果:Accepted
具体描述见连接:http://poj.org/problem?id=2533
// write your code here cpp
#include
int main(){
int N;
while(scanf("%d",&N)!= EOF){
int *arr = new int[N];
int *martix = new int [N];
for(int i = 0;i=0;j--)
if(arr[i] > arr[j])
martix[i] = martix[i] > (martix[j]+1)?martix[i]:(martix[j]+1);
}
int result = martix[0];
for(int k = 1;kresult?martix[k]:result;
printf("%d\n",result+1);
}
}
结果:Accepted
PS: 时间复杂度为 o(N^2) 比较久
具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
// write your code here cpp
#include
int main(){
int N;
while(scanf("%d",&N)!= EOF && N!=0){
int *arr = new int[N];
int *martix = new int [N];
for(int i = 0;i=0;j--)
if(arr[i] > arr[j])
martix[i] = martix[i] > (martix[j]+arr[i])?martix[i]:(martix[j]+arr[i]);
}
int result = martix[0];
for(int k = 1;kresult?martix[k]:result;
printf("%d\n",result);
}
}
结果:Accepted
PS:其实这道题跟第二个问题很类似,将第二问题改一下就好。
具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
#include
#include
#include
int MaxValue[1000][1000];
int main(){
int Case,N,V;
scanf("%d",&Case);
while(Case--){
scanf("%d%d",&N,&V);
int *Value = new int[N+1];
int *Volume = new int [N+1];
for(int i = 1;i<=N;i++){
scanf("%d",&Value[i]);
}
for(int i = 1;i<=N;i++){
scanf("%d",&Volume[i]);
}
memset(MaxValue,0,sizeof(MaxValue));
for(int i = 1;i<=N;i++)
for(int j = 0;j<=V;j++){
if(Volume[i]<=j)
MaxValue[i][j] = fmax(MaxValue[i-1][j],MaxValue[i-1][j-Volume[i]]+Value[i]);
else
MaxValue[i][j] = MaxValue[i-1][j];
//printf("%d ",MaxValue[i][j]);
}
printf("%d\n",MaxValue[N][V]);
delete[] Value;
delete[] Volume;
}
return 0;
}
一维滚动数组
#include
using namespace std;
int dp[20001];
int main(){
int V,N;
scanf("%d%d",&V,&N);
int *tmp = new int[N];
for(int i =0;i=tmp[i];v--){
dp[v] = max(dp[v],dp[v-tmp[i]]+tmp[i]);
}
}
int maxV = 0;
for(int i =0;i<=V;i++)
maxV = max(maxV,dp[i]);
printf("%d\n",V-maxV);
return 0;
}
完全背包问题:
具体描述见连接:http://poj.org/problem?id=1458
#include
#include
#include
#include
using namespace std;
int maxvalue[1000][1000];
int main(){
string str1,str2;
while(cin >> str1 >> str2){
int len1 = str1.length(),len2 = str2.length();
for(int i = 0;i
#include
using namespace std;
const int W = 40;
int main(){
int N;
scanf("%d",&N);
vector< vector> way (W+1,vector(N+1));
vector arr(N+1);
for(int i = 1;i<=N;++i){
cin >>arr[i];
way[0][i] = 1;
}
way[0][0]=1;
for(int w =1;w<=W;++w){
for(int k =1;k<=N;k++){
way[w][k] =way[w][k-1];
int tmp = w-arr[k];
if( tmp>=0){
way[w][k] += way[tmp][k-1];
}
}
}
cout << way[W][N]<
注:本博文为原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:https://blog.csdn.net/aron_conli/article/details/87925453
原作者博客:https://blog.csdn.net/aron_conli
---------------------
版权声明:本文为博主原创文章,转载请附上博文链接!