有 k k k 种物品(每种有无数个),每种物品价值为 a i a_i ai,重量为 b i b_i bi,小明有一个包,这个包里最多能装 s s s 个物品,最大能装的总重量是 m m m。问从这 k k k 个物品里进行选择,最终能否使包里物品的总价值 ≥ n \ge n ≥n?
完全背包,代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 105
using namespace std;
int n,m,k,s,a[MAXN],b[MAXN],dp[MAXN],c[MAXN];
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){
for(int i=1;i<=k;i++)
scanf("%d%d",&a[i],&b[i]);
memset(dp,0,sizeof(dp));
memset(c,0,sizeof(c));
bool flag=false;
int res=0;
for(int i=1;i<=k;i++)
for(int j=b[i];j<=m;j++){
if(dp[j]<n&&dp[j]<dp[j-b[i]]+a[i]&&c[j-b[i]]<s){
dp[j]=dp[j-b[i]]+a[i];
c[j]=c[j-b[i]]+1;
if(dp[j]>=n){
flag=true;
if(m-j>res)res=m-j;
}
}
}
if(flag)printf("%d\n",res);
else printf("-1\n");
}
return 0;
}