01背包问题 很裸的动态规划

本文通过一个具体的例子详细解析了如何使用动态规划解决背包问题。包括状态转移方程的定义及其实现代码,有助于理解如何根据物品大小和价值确定最优解。

状态转移方程:

dp[v] = max{dp[v], dp[v-size[i]]+value[i]}
// size[i] --> 第 i 件物品的大小  value[i]--> 第 i 件物品的价值
// 背包大小为 V
// 物品数量为 N

 

#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctype.h>
#include<algorithm>
#include<map>
#include<vector>

#define MAX 100005
#define MOD 1000003
#define inf 100000000
#define eps 1e-9
#define pi acos(-1.0)
#define LL long long 
#define I64 __int64
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))

// now 背包问题

int dp[1000];

int main()
{
	int V, N;
	int size[20], value[20];
	freopen("in.txt", "r", stdin);
	while(scanf("%d", &V) != EOF)
	{
		scanf("%d", &N);
		for(int i = 1;i <= N;i ++)
			scanf("%d %d", &size[i], &value[i]);

		// processing
		for(int i = 1;i <= N;i ++)
		{
			for(int v = V;v > size[i];v --)
			{
				dp[v] = max(dp[v], dp[v-size[i]]+value[i]);
			}
		}
		printf("%d\n", dp[V]);
	}
}
/*
100 5
77 92
22 22
29 87
50 46
99 90

200 8
79 83
58 14
86 54
11 79
28 72
62 52
15 48
68 62

*/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值