版权声明:置顶文章如需转载请联系作者 https://blog.csdn.net/Bonstoppo/article/details/80820576
题目:蒜头君的购物袋1(完成)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int V,n;
int w[35],dp[20005];
scanf("%d",&V);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
//边界
for(int v=0;v<=V;v++){
dp[v]=0;
}
for(int i=1;i<=n;i++){
for(int v=V;v>=w[i];v--){
//状态转移方程//
dp[v]=max(dp[v],dp[v-w[i]]+w[i]);
}
}
//在这里面的dp[0-V]即是答案。//
int max=0;
for(int v=0;v<=V;v++){
if(dp[v]>max)
max=dp[v];
}
//让求最小值,在这里求最大值,然后做差即可。//
printf("%d\n",V-max);
return 0;
}
题目:蒜头君的购物袋2(完成)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int V,n;
int dp[1005],w[105],p[105];
scanf("%d%d",&V,&n);
for(int i=1;i<n;i++){
scanf("%d%d",&w[i],&p[i]);
}
//边界//
for(int v=0;v<=V;v++){
dp[v]=0;
}
for(int i=1;i<=n;i++){
for(int v=V;v>=w[i];v--){
//状态转移方程//
dp[v]=max(dp[v],dp[v-w[i]]+p[i]);
}
}
//求最大的值//
int max=0;
for(int v=1;v<=V;v++){
if(dp[v]>max){
max=dp[v];
}
}
printf("%d\n",max);
return 0;
}
题目:蒜头君的购物袋3(完成)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int V,n;
int vi[1005],pi[1005],dp[10005];
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++){
scanf("%d%d",&vi[i],&pi[i]);
}
for(int v=1;v<=10005;v++){
dp[v]=0;
}
//状态转移方程//
for(int i=1;i<=n;i++){
for(int v=vi[i];v<=V;v++){
dp[v]=max(dp[v],dp[v-vi[i]]+pi[i]);
}
}
int max=0;
for(int v=1;v<=V;v++){
if(max<dp[v]){
max=dp[v];
}
}
printf("%d",max);
return 0;
}
题目:
蒜头跳木桩(完成)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
int A[1005],dp[100005];
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&A[i]);
}//输入//
int ans=-1;
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){
//这个地方是不大于//
if(A[j]>=A[i] && dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
}
}
ans=max(ans,dp[i]);
}
printf("%d",ans);
return 0;
}
题目:删除最少的元素
题目:最长公共子序列(完成)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
char a[1005],b[1005];
int dp[1005][1005];
int n;
gets(a+1);
gets(b+1);//两个坐标从1开始读//
int lena=strlen(a+1);
int lenb=strlen(b+1);
//范围限定//
for(int i=0;i<=lena;i++){
dp[i][0]=0;
}
for(int j=0;j<=lenb;j++){
dp[0][j]=0;
}
//状态转移方程//
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
if(a[i]==b[j]){
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d\n",dp[lena][lenb]);
return 0;
}