hihocoder #1091

来源:互联网 发布:网络配音培训班 编辑:程序博客网 时间:2024/06/05 16:01

虽然一看就是dp 然并卵还是看了提示,学习了背包的几种变化

记录一下

#include<iostream>  #include <string>   #include<vector>  #include<algorithm>  #include<set>  #include<fstream>#include<cmath>  using namespace std;  #define lch(i) ((i)<<1)  #define rch(i) ((i)<<1|1)  #define sqr(i) ((i)*(i))  #define pii pair<int,int>  #define mp make_pair  #define FOR(i,b,e) for(int i=b;i<=e;i++)  #define ms(a)   memset(a,0,sizeof(a))  const int maxnum =155;  const int inf = 20005;int n,m;int dp[35][inf];int cost[35][maxnum];int csum[35][maxnum];int dam[35][maxnum];int main()  {  //ifstream fin("G:/1.txt");scanf("%d%d",&n,&m);int A,B;ms(csum);ms(cost);ms(dam); ms(dp);FOR(i,1,n){scanf("%d%d",&A,&B);if(B>m)continue;cost[i][1]=csum[i][1]=B;dam[i][1]=A;for(int j=2;;j++){cost[i][j]=cost[i][j-1]*1.07;if(csum[i][j-1]+cost[i][j]>m){csum[i][0]=j-1;break;}csum[i][j]=csum[i][j-1]+cost[i][j];dam[i][j]=dam[i][j-1]+A;}}FOR(i,1,n){FOR(j,0,m){dp[i][j]=max(dp[i-1][j],dp[i][j]);FOR(k,1,csum[i][0]){if(j<csum[i][k])continue;dp[i][j]=max(dp[i][j],dp[i-1][j-csum[i][k]]+dam[i][k]);}}}int ans=0;FOR(i,0,m)ans = max(ans,dp[n][i]);cout<<ans<<endl;return 0;}

0 0
原创粉丝点击