链接:点击打开链接
题意:给出一个价值sum,然后给出n钱币的个数与价值,要求用这些钱币组成一个最接近sum的值(总和不大于sum)
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
bool f[100005];
long long v[105],w[105],used[100005];
int main(){
long long n,i,j,ans,sum;
while(scanf("%I64d",&sum)!=EOF){
memset(f,0,sizeof(f));
scanf("%I64d",&n);
for(i=0;i<n;i++)
scanf("%I64d%I64d",&w[i],&v[i]);
ans=0,f[0]=1;
for(i=0;i<n;i++){
memset(used,0,sizeof(used));
for(j=v[i];j<=sum;j++){
if(f[j-v[i]]&&!f[j]&&used[j-v[i]]<w[i]){
f[j]=1;
used[j]=used[j-v[i]]+1;
ans=max(ans,j); //求出最大值
}
} //多重背包
}
printf("%I64d\n",ans);
}
return 0;
}