Wiki OI 1014 装箱问题

题目链接:http://wikioi.com/problem/1014/

算法与思路:01背包

转移方程为dp[i][j]=max{dp[i-1][j],dp[i-1][j-cost[i]]+w[i]}
表示考虑第i件物品,容量为j时,有两种策略,第一种是不选该物品,第二种为选择该物品,在这两种策略中选择一个最优策略

#include<stdio.h>
#include<string.h>
int v, n;
int dp[20005];
int Max(int x,int y)
{
	return x > y ? x : y;
}
void zeroonepack(int cost, int value)
{
	int i;
	for(i = v; i >= cost; i--)
	dp[i] = Max(dp[i], dp[i - cost] + value);
}
int main()
{
	int i;
	int a[33];
	scanf("%d %d",&v, &n);
	for(i = 0; i < n; i++)
		scanf("%d", &a[i]);
	memset(dp, 0, sizeof(dp));
	for(i = 0; i < n; i++)
		zeroonepack(a[i], a[i]);
	printf("%d\n",v - dp[v]);
	return 0;
}


你可能感兴趣的:(Wiki OI 1014 装箱问题)