HDU 2602 Bone Collector(0 1背包)

本文通过C++代码详细展示了如何解决经典的0-1背包问题,采用动态规划算法进行求解,实现了物品的选择以达到最大价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//题意自己看,不会度娘
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int main(int argc, char *argv[])
{
	int i,j;
	int t,n,v,n1[1005],v1[1005];
	int a[1005][1005];
	scanf("%d",&t);
	while(t--)
	{
		memset(a,0,sizeof(a));
		memset(n1,0,sizeof(n1));
		memset(v1,0,sizeof(v1));//数组清零 
		scanf("%d %d",&n,&v);//输入体积和价值 
		for(i=1;i<=n;i++)
			scanf("%d",&n1[i]);
		for(i=1;i<=n;i++)
			scanf("%d",&v1[i]);//数据输入 
		for(i=1;i<=n;i++)//每个物品循环过去 
		{
			for(j=0;j<=v;j++)//体积从0开始 
			{
				if(j>=v1[i])//如果现在的体积能放下第i个物品就开始比较 
				{
					a[i][j]=max(a[i-1][j],a[i-1][j-v1[i]]+n1[i]);
					printf("**i=%d,j=%d,a[i][j]=%d ",i,j,a[i][j]); 
				}
				else//不能放入第i个物品就找上一次的最优解 
					a[i][j]=a[i-1][j];
			}	
			printf("\n");
		}
		printf("%d\n",a[n][v]);	
	}
	return 0;
}
//Start-ZJ
//2017/12/21/19:31

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值