hdu 4508 湫湫系列故事——减肥记I(完全背包)
题意:完全背包
思路:完全背包
可以直接转化为 多重背包,num[i]=_v/c[i];//转为多重背包
然后运用 多重背包 3种解法如下
码1:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j,k,tem;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
int num[];//每种物品个数
int tc,tv;//拆分时物品花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp)); for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
//////
for(i=; i<=n; ++i)
for(k=_v; k>=c[i]; --k)
for(j=; j<=num[i]&&j*c[i]<=k; ++j)//此处比01背包多了一层循环
{
tc=j*c[i];
tv=j*v[i];
tem=dp[k-tc]+tv;
if(tem>dp[k])dp[k]=tem;
}
//
printf("%d\n",dp[_v]);
}
return ;
}
码2:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j,k,tem;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
int num[];//每种物品个数
int tc,tv;//拆分时物品花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp)); for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
//////
for(i=; i<=n; ++i)
for(j=; j<=num[i]&&j*c[i]<=_v; ++j)//此处比01背包多了一层循环
for(k=_v; k>=j*c[i]; --k)
{
tem=dp[k-c[i]]+v[i];
if(tem>dp[k])dp[k]=tem;
}
//
printf("%d\n",dp[_v]);
}
return ;
}
码3:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j,k,tem;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
int num[];//每种物品个数
int tc,tv;//拆分时物品花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp)); for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
//////
for(i=; i<=n; ++i)
{
for(j=; j<=num[i]; num[i]=num[i]-j,j=j*)//此处比01背包多了一层循环
{
tc=j*c[i];//拆分后物品花费
tv=j*v[i];//
for(k=_v; k>=tc; --k)
{
tem=dp[k-tc]+tv;
if(tem>dp[k])dp[k]=tem;
}
}
if(num[i]>) //如果还有物品,num[i] 即相当于 1+2+4+...+q 中的 q
{
tc=num[i]*c[i];
tv=num[i]*v[i];
for(k=_v; k>=tc; --k)
{
tem=dp[k-tc]+tv;
if(tem>dp[k])dp[k]=tem;
}
}
}
//
printf("%d\n",dp[_v]);
}
return ;
}
另外:附一种更高效的方法 O(n*_v)
与01背包代码中内层循环相反
1...n
0..._v
码4:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp));
for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)
for(j=c[i];j<=_v;++j)
if(dp[j-c[i]]+v[i]>dp[j])dp[j]=dp[j-c[i]]+v[i];
printf("%d\n",dp[_v]);
}
return ;
}
hdu 4508 湫湫系列故事——减肥记I(完全背包)的更多相关文章
- HDU 4508 湫湫系列故事——减肥记I(全然背包)
HDU 4508 湫湫系列故事--减肥记I(全然背包) http://acm.hdu.edu.cn/showproblem.php?pid=4508 题意: 有n种食物, 每种食物吃了能获得val[i ...
- 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)
湫湫系列故事――减肥记I HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...
- HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...
- HDUOJ----湫湫系列故事——减肥记I
湫湫系列故事——减肥记I Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- hdu4508 完全背包,湫湫系列故事——减肥记I
湫湫系列故事——减肥记I 对于01背包和完全背包,昨晚快睡着的时候,突然就来了灵感 区别:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值 在第二重循环,01 是倒着循环的,因 ...
- HDUOJ----4509湫湫系列故事——减肥记II
湫湫系列故事——减肥记II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- G - 湫湫系列故事——减肥记I
G - 湫湫系列故事——减肥记I Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u De ...
- M - 湫湫系列故事——减肥记I
M - 湫湫系列故事--减肥记I 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于女生来说,卡路里(热量)是天敌啊! 资深美女湫湫深谙"胖来如山倒,胖去如抽丝"的道理,所 ...
- HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)
http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. 接下来n行,每行两 ...
- 【完全背包】HDU 4508 湫湫系列故事——减肥记I
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s) ...
随机推荐
- 关于JLINK固件丢失或升级固件后提示Clone的解决办法
本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示.在网上找了许多关于修复的资料,都觉得不是很好.经过本人反复试验,总算找到比 ...
- dojo新建widget步骤----主要针对widget路径
一,新建目录 二,新建文件 三,写urtil widget代码 四,写RedTextDialog代码 五,写HTML代码 =====================如有不懂,结合http://blog ...
- Action的执行
异步Action的定义 两种异步Action方法的定义 xxxAsync/xxxCompleted 这种形式的异步只能定义在实现了AsyncController的Controller中.针对Task的 ...
- 展讯NAND Flash高级教程【转】
转自:http://wenku.baidu.com/view/d236e6727fd5360cba1adb9e.html 展讯NAND Flash高级教程
- 如何给桌面搬家(Win XP)
是不是习惯把一些常用的文件放在桌面上?或者接收个文件就直接放桌面了,这样用起来方便点. 可是一旦你重装系统或者恢复系统,桌面又回到了以前的状态,很多的文件就丢了.小心的话,重做系统前会做个备份.但如果 ...
- G-sensor 与M-sensor区别
g-sensor是重力传感器,能感应芯片在三个方向(通常是)上的重力加速度.手机里的重力球用的就是这个技术,m-sensor如果是motion sensor的简称的话,基本上指的和g-sensor是一 ...
- 下拉刷新控件(5)SwipeRefreshLayout官方教程(下)响应刷新事件
http://developer.android.com/training/swipe/respond-refresh-request.html This lesson shows you how t ...
- STL头文件
#include <iostream>标准输入输出cin cout等 #include <algorithm> 算法库 如sort find等 #include <vec ...
- number-of-boomerangs
https://leetcode.com/problems/number-of-boomerangs/ package com.company; import java.util.*; class S ...
- datagridview的某些属性以及增删改查
private void button1_Click(object sender, EventArgs e) //查询 { dataGridView1.AutoGenerateColumns = fa ...