http://acm.hdu.edu.cn/showproblem.php?pid=2159
二维费用完全背包
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int Max = 110;
struct monster{
int v,w;
}node[Max];
int N,V1,M,V2;
int dp[Max][Max];
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d%d%d%d",&N,&V1,&M,&V2) == 4){
for(int i=1; i<=M; i++)
scanf("%d%d",&node[i].v,&node[i].w);
memset(dp, 0, sizeof(dp));
for(int i=1; i<=M; i++){
for(int j=node[i].w; j<=V1; j++){
for(int k=1; k<=V2; k++){
dp[j][k] = max(dp[j][k], dp[j-node[i].w][k-1] + node[i].v);
}
}
}
int k = 0,flag = true;
for(int i=0; i<=V1; i++){
if(!flag) break;
for(int j=0; j<=V2; j++){
if(dp[i][j] >= N){
k = i;
flag = false;
break;
}
}
}
if(flag) printf("-1\n");
else printf("%d\n",V1-k);
}
return 0;
}