您的位置:首页 > 其它

题目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]刚开始要初始化为正无穷这个无效状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: