代码实现
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxm = 110;
const int maxn = 30;
int n;
int m;
int w[maxn];
int dp[maxm];
int main(){
while(scanf("%d",&m)!=EOF){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int j=0;j<=m;j++){
dp[j] = 0x3fffffff;
}
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];--j){
dp[j] = min(dp[j-w[i]]+1,dp[j]);
}
}
if(dp[m] == 0x3fffffff){
printf("0\n");
}else{
printf("%d\n",dp[m]);
}
}
return 0;
}
码后反思
- 一道非常基础的充满背包的0-1背包问题,注意这类问题与0-1背包的唯一不同就是初始化的问题,如果想不清,可以举一个例子呀~~~