http://acm.hdu.edu.cn/showproblem.php?pid=2159
二维费用的背包
wa了好多次,要求最大忍耐度,开始没处理好,想当然了
View Code
#include <iostream> using namespace std ; int dp[101][101] ; int w[101],c[101] ; int main() { int n,m,k,s ; while(~scanf("%d%d%d%d",&n,&m,&k,&s)) { for(int i=0;i<k;i++) scanf("%d%d",&w[i],&c[i]) ; memset(dp,0,sizeof(dp)) ; int flag=0 ; int cnt=INT_MAX ; for(int i=0;i<k;i++) for(int j=c[i];j<=m;j++) for(int k=1;k<=s;k++) { dp[j][k]=max(dp[j][k],dp[j-c[i]][k-1]+w[i]) ; if(dp[j][k]>=n) { if(cnt>j) { flag=1 ; cnt=j ; } } } if(flag) printf("%d\n",m-cnt) ; else puts("-1") ; } return 0 ; }