P1855 榨取kkksc03 二维费用背包

Kkksc03的时间和金钱是有限的,所以他很难满足所有同学的愿望。所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望?

输入输出格式

输入格式:

第一行,n M T,表示一共有n(n<=100)个愿望,kkksc03 的手上还剩M(M<=200)元,他的暑假有T(T<=200)分钟时间。

第2~n+1行 mi,ti 表示第i个愿望所需要的金钱和时间。

输出格式:

一行,一个数,表示kkksc03最多可以实现愿望的个数。

输入输出样例

输入样例#1: 复制
6 10 10
1 1
2 3 
3 2
2 5
5 2
4 3
输出样例#1: 复制
4

一开始将 j,s放在一个for里遍历 导致漏掉了很多的状态 (想一想)
其他没什么难度
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define N 500+5
#define inf 0x3f3f3f3f
int mp[N][N];
long long dp[N][N];
int main()
{
  int n,m,k;
  RIII(n,m,k);
  rep(i,1,n)
  {
    int a,b;
    RII(a,b);
    for(int j=m;j>=a;j--)
    for(int s=k;s>=b;s--)
    dp[j][s]=max(dp[j][s],dp[j-a][s-b]+1);
  }
  cout<<dp[m][k];
}









原文地址:https://www.cnblogs.com/bxd123/p/10518601.html