记忆化搜索+背包问题

入侵和反击
A国部署的反导系统遇到了一个致命BUG,那就是每一次发射的拦截导弹的飞行高度都将只能小于等于上一枚导弹的飞行高度,第一次发射的拦截导弹的飞行高度可以看作是足够大。对于A国,这是一件很严重的问题,这意味着A国的防空系统面临空前危机。

通过对A国的军事部门计算机的入侵,A国还不知道敌对国B国刚才已经发现了这项BUG。更不知道,在这项BUG的报告书上交到B国空军司令部那一刻,三分钟后B国的全体高级空军军官已经在作战室讨论作战方案。

如果战争真的开始,B国将依次派出n架战斗机A国将依次发射拦截导弹,这n架飞机的飞行高度分别是h1h2h3…hn。B国将要充分利用这项漏洞,考虑到这么一种情况,假设只要A国的导弹的飞行高度大于等于B国飞机就能百分之百地锁定并击落,那么B国,最少将会有几架不被击落飞机?

#include<bits/stdc++.h>
using namespace std;
const int maxn = 20000+5;
int t,n;
int h[maxn];
int dp[maxn];
int main(){
  cin>>t;
  int cnt,temp;
  while(t--){
    cnt=0;
    cin>>n;
    for(int i=0;i<n;i++){
      cin>>h[i];
    }

    for(int i=0;i<n;i++){
      dp[i]=1;
      for(int j=0;j<i;j++){
        if(h[j]>=h[i]){
          dp[i]=max(dp[i],dp[j]+1);
        }
      }
    }
    int m=-1;
    for(int i=0;i<n;i++){
      m=max(m,dp[i]);
    }
    cout<<n-m<<endl;
  }
}

红红绝地求生
红红最近迷上了吃鸡,房间有n个配件,每一个配件的重量为c(<=1e3),和价值为v(v <= 1e3)假设红红刚落地就捡到一个三级包,容量为S,请问红红可以成为多肥的快递员?

#include<bits/stdc++.h>
using namespace std;
const int maxn = 12880 + 5;
int w[maxn],d[maxn],dp[maxn];
int main(){
 int n,m,t;
 cin>>t;
 while(t--){
   memset(w,0,sizeof w);
   memset(d,0,sizeof d);
   memset(dp,0,sizeof dp);
   cin>>n>>m;
   for(int i=1;i<=n;i++){
     cin>>d[i];
   }
   for(int i=1;i<=n;i++){
     cin>>w[i];
   }
   for(int i=1;i<=n;i++){
     for(int j=m;j>=w[i];j--){
       dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
     }
   }
   cout<<dp[m]<<endl;
 }
 return 0;
}

红红减肥记
对于吃货来说,过年最幸福的事情就是吃,没有之一!
但是对于红红来说,卡路里(热量)是天敌。
红红想要一个健美的身材,所以需求舒舒设定了一个健康且幸福的食谱计划。
为了方便食谱的制作,舒舒给红红的每日清单上面描述了当天她想吃的食物给他的幸福度,以及会增加卡路里。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000;
int w[maxn],v[maxn],dp[maxn];
int n,m;
int main(){
  while(cin>>n){
    for(int i = 1;i<=n;i++){
      cin>>v[i]>>w[i];
    }
    cin>>m;
    for(int i=1;i<=n;i++){
      for(int j=w[i];j<=m;j++){
        dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
      }
    }
    cout<<dp[m]<<endl;
  }
  return 0;
}
发布了54 篇原创文章 · 获赞 28 · 访问量 7303

猜你喜欢

转载自blog.csdn.net/jiangkun0331/article/details/97425920