最小邮票数——01背包
代码调试
最开始怎么也无法通过,后来发现了如下几个问题:
1.dp初始化问题dp[0]=0
2.dp初始化问题for循环一定要注意边界,最开始我写的<m。
题目描述
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
代码
#include<stdio.h>
using namespace std;
#define INF 0x7777ffff
int dp[101];
int weight[100];
int min(int a,int b){
return a<b?a:b;
}
int main(){
int m;
while(scanf("%d",&m)!=EOF){
for(int i=0;i<=m;i++) dp[i]=INF;
dp[0]=0;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&weight[i]);
}
for(int i=0;i<n;i++){
for(int j=m;j>=weight[i];j--){
if(dp[j-weight[i]]!=INF) dp[j]=min(dp[j],dp[j-weight[i]]+1);
}
}
if(dp[m]>n) printf("0");
else printf("%d",dp[m]);
}
return 0;
}