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(); }