题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159
思路:二维费用背包即为同时有两个约束条件,dp数组多加一维,循环也多加一维,其他的一样,具体看代码
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 1e2 + 5;
const int mod = 1e9 + 7;
int n,m,k,s;
int dp[maxn][maxn];
int jy[maxn],rn[maxn];
int main () {
while (~scanf ("%d%d%d%d",&n,&m,&k,&s)){
memset(dp,0,sizeof(dp));
for (int i=0;i<k;i++){
int a,b;
scanf ("%d%d",&a,&b);
jy[i]=a,rn[i]=b;
}
for (int i=0;i<k;i++){
for (int j=1;j<=m;j++){
for (int q=1;q<=s;q++){
if (j>=rn[i])
dp[j][q]=max(dp[j][q],dp[j-rn[i]][q-1]+jy[i]);
}
}
}
if (dp[m][s]>=n){
for (int i=0;i<=m;i++){
if (dp[i][s]>=n){
printf ("%d\n",m-i);
break;
}
}
}
else printf ("-1\n");
}
return 0;
}