题目1209:最小邮票数(01背包)
2014-10-21 10:46
351 查看
//题目1209:最小邮票数题目描述: //有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 //如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。 #include "stdafx.h" #pragma warning(disable:4996) #include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; int v,N; int w[1000]; int dp[1000]; #define inf 1000000 int min(int a,int b) { return a>b?b:a; } void solve() { memset(dp,inf,sizeof(dp)); dp[0] = 0; for (int i=1;i<=N;++i)//遍历物品 { for (int j=v;j>=w[i];--j)//遍历体积,价值为1,也即邮票的张数,我们要取得最小的价值。 { dp[j]=min(dp[j],dp[j-w[i]]+1); } } if(dp[v] >=1000) cout << 0 << endl; else cout << dp[v] << endl; } int main() { freopen("a.txt","r",stdin); while (cin>>v>>N) { for (int i=1;i<=N;++i) { scanf("%d",&w[i]); } solve(); } return 0; }
恰好装满的01背包问题,注意f[0]=0这个初始化,它表示背包容量为0的时候,没有任何物品可以放入背包的状态。
另外需注意该题是求最小的个数,也即物品最小的价值数,所以f[v]刚开始要初始化为正无穷这个无效状态。
相关文章推荐
- 九度oj 题目1209:最小邮票数 (01背包)
- 九度OJ 题目1209:最小邮票数
- 题目1209:最小邮票数
- 题目1209:最小邮票数 动态规划 java实现
- 题目1209:最小邮票数
- 题目1209:最小邮票数
- 九度题目1209:最小邮票数
- 九度 oj 题目1209:最小邮票数
- 题目1209:最小邮票数
- 题目1209:最小邮票数DP
- 题目1209:最小邮票数
- 九度题目1209:最小邮票数
- 题目1209:最小邮票数
- 题目1209:最小邮票数
- 1209_最小邮票数
- 九度OJ 1209:最小邮票数 (遍历)
- HDOJ 题目456 邮票分你一半(01背包)
- 九度OJ 1209:最小邮票数 (遍历)
- 九度OJ - 1209 - 最小邮票数
- 九度笔记之 1209最小邮票数