动态规划-完全背包-一维数组
动态规划-完全背包
洛谷 P2722
https://www.luogu.com.cn/problem/P2722
#include<iostream> using namespace std; int x,y; //t每种类型需要时间 p每种类型获得分数 int t[10002],p[10002]; //前i种题目,tj时间内获得分数 int dp[10002]; int main(){ int m,n; cin>>m>>n;//m竞赛时间 n是指题目种类 for(int i=1;i<=n;i++){ //pi i类题获得分数 ti 类题花费时间 cin>>p[i]>>t[i]; } for(int i=1;i<=n;i++){ //前i种种类,j时间内获得最大分数 //每种类可以多次累加,比如只有一种时 //i=1 j=8 t[1]=4 dp[8]=dp[4]+p[1] --dp[4]即为p[1] for(int j=t[i];j<=m;j++){ dp[j]=max(dp[j],dp[j-t[i]]+p[i]); } } //dp[m] m时间内所有种类获得最大分数 cout<<dp[m]; return 0; }
洛谷 P1616
https://www.luogu.com.cn/problem/P1616
#include <bits/stdc++.h> using namespace std; //t用来采药的时间 m山洞里草药的种类 int t,m; //采第i种草药需要的时间和价值 int a[10002], b[10002]; //前i种采药 j时间内采药最大的价值 long long dp[10000002]; int main(){ scanf("%d %d", &t,&m); for(int i=1; i <=m; i++) { scanf("%d %d", &a[i], &b[i]); } for(int i = 1; i <= m; i++){ //前i种采药 j时间内采药最大的价值 for(int j = a[i]; j <= t; j++) { //加入价值变大则加入 dp[j] = max(dp[j],dp[j-a[i]] + b[i]); } } //所有种类草药 t时间内采药的最大价值 printf("%lld", dp[t]); return 0; }
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号