0-1背包

/*The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.




Output
One integer per line representing the maximum of the total value (this number will be less than 231).




Sample Input
1
5 10
1 2 3 4 5
5 4 3 2 1




Sample Output
14


*/






#include<iostream>
#include<stdio.h> 
#include<string.h>
#define max(a, b)  a > b ? a : b
using namespace  std;
int dp[1005][1005];
//  物品数量     背包容量
//  物品价值
//  物品体积 
int fun(int N, int W, int w[1000], int v[1000]) {


int i, j;
memset(dp, 0, sizeof(dp));




for (j = 0; j <= W; j++) dp[0][j] = 0;
//按以下方案填充数组,是一行一行的填充, 每一行填充完毕,才填充接下来的一行
//翻译: 分别解决 前 1 个物品在, 0 ~ w下所能构成的最优装载方案
//      前 2 个物品在 0 ~  w下最优填充方案
//      但是可以理解为, 仅仅是对第二个物品的讨论, 只有放入与不放入, 并且分别讨论 容量为 0 ~ w 下个情况
//      总结一句话, 分别讨论在 0 ~ w 总共 w 种情况下,第 2 个物品是否放入


//      接下来讨论第 3 个 物品是否放入, 
/* 要明白某一组确定的 i, j下 ,  dp[i][j] 的意思为, 前i个物品放入容量为j的背包的最大价值, 要始终名明确,
       i,j 的值不能改变, 相当于一个子问题*/
//      自然地,若第三个物瓶确定不放入, 则  dp[i][j]    =    dp[i - 1][j]   注意j 的值不变‘
//      若第三确定放入                则  dp[i][j]    =    dp[i - 1][j - w[i]] + v[i]
//                                     ↑ 欲求原问题       ↑依赖于子问题
for (i = 1; i <= N; i++)
{
for (j = 0; j <= W; j++)
{
if (j < w[i]) dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);




}
}


return dp[N][W];
}








int main() {
int t;
int N, W;


cin >> t;
while (t--) {
int w[1000] = { 0 }, v[1000] = { 0 };
int i;
cin >> N;
cin >> W;


for (i = 1; i <= N; i++)
cin >> v[i];


for (i = 1; i <= N; i++)
cin >> w[i];




cout << fun(N, W, w, v) << endl;


}






// system("pause");
return 0;


}




/*
一些感悟


大数组要开在全局区
数组的大小要严格按照题目的说明
对于多组数据的测试,每柱开始测试前所有数据都要初始化,很重要,有时候很可能单组数据可以过,多组就不行
对于循环的计数的起点要有一定的选择






*/













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值