模板——01背包

01背包

题目描述
许多年前,在泰迪的故乡,有一个被称为“骨收集者”的人。这个人喜欢收集各种各样的骨头,比如狗的,牛的,还有他去坟墓的。
骨收集器有一个体积很大的V形包,在收集的过程中有很多骨头,显然,不同的骨头有不同的价值和不同的体积,现在根据每次旅行的骨头的价值,你能计算出骨收集器的总价值的最大值吗?

输入
第一行包含整数T,实例数。
其次是T型病例,每例三行,第一行包含两个整数n,v,(n<=1000,v<=1000),表示骨的数量和袋的体积。第二行包含表示每个骨的值的n个整数。第三行包含代表每个骨体积的n个整数。

产量
每行一个整数表示总值的最大值(这个数字小于2)三十一)

样本输入

1、5、10、1、2、3、4、5、5 4 4 3 2

样本输出

14

const int maxn = 1e3 + 5;
//int w[3]={150,200,350};
int t, n, W;
int c[maxn];//体积
int w[maxn];//价值
int dp[maxn][maxn];

int solve() {
	memset(dp, 0, sizeof(dp));
	for (int i = 0; i < n; i++)
		for (int j = 0; j <= W; j++)
			if (j >= c[i])
				dp[i + 1][j] = max(dp[i][j], dp[i][j - c[i]] + w[i]);
			else
				dp[i + 1][j] = dp[i][j];
	return dp[n][W];
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> t;
	while (t--) {
		cin >> n >> W;
		for (int i = 0; i < n; i++)
			cin >> w[i];
		for (int i = 0; i < n; i++)
			cin >> c[i];
		cout << solve() << endl;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值