洛谷P1855 榨取kkksc03 dp

01背包,用滚动数组滚一下

dp[j][k]表示j块钱k时间能实现的最大愿望数

dp[j][k]=max(dp[j][k],dp[j-a[i].m][k-a[i].t]+1)

#include<iostream>
using namespace std;
int dp[205][205];//第一维表示面对前i个学生,第二维表示钱,第三维表示时间
int n,M,T;
struct pp
{
    int m,t;
}a[105];
void solve()
{
    int i,j,k;
    cin>>n>>M>>T;
    for(i=1;i<=n;i++)cin>>a[i].m>>a[i].t;
    for(i=1;i<=n;i++)
        for(j=M;j>=a[i].m;j--)
            for(k=T;k>=a[i].t;k--)
            {    
                dp[j][k]=max(dp[j][k],dp[j-a[i].m][k-a[i].t]+1);
            } 
    cout<<dp[M][T]<<endl;
} 
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/10022019.html