hdu_2159_FATE(完全背包)
题目连接:hdu_2159_FATE
题意:完全背包的题意
题解:把杀敌数看成背包的容量,维护一个经验的最大值,我是多开一维来记录最大的忍耐度,当然你也可以直接开一位,并记录忍耐度,最后扫一遍
1 #include<cstdio> 2 #include<cstring> 3 #define F(i,a,b) for(int i=a;i<=b;i++) 4 inline void up(int &x,int y){if(x<y)x=y;} 5 6 int n,m,k,s,a[111],b[111],dp[111][111]; 7 8 int main(){ 9 while(~scanf("%d%d%d%d",&n,&m,&k,&s)){ 10 memset(dp,0,sizeof(dp)); 11 F(i,1,k)scanf("%d%d",a+i,b+i); 12 F(i,1,k)F(j,1,s)F(kc,0,m-b[i]) 13 up(dp[j][kc],dp[j-1][kc+b[i]]+a[i]); 14 int ans=-1; 15 for(int i=m;i>=0;i--)if(dp[s][i]>=n){ans=i;break;} 16 printf("%d\n",ans); 17 } 18 return 0; 19 }