【计蒜客】蒜头君的购物袋 1

版权声明:置顶文章如需转载请联系作者 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;
    
}


猜你喜欢

转载自blog.csdn.net/Bonstoppo/article/details/80820576