vj-苹果(01背包)
来源:互联网 发布:男生打扮知乎 编辑:程序博客网 时间:2024/05/17 08:04
苹果
ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。
Input
Output
Sample Input
3 31 12 13 10 0
Sample Output
2
这是一道简单动态规划 身为新手的写了一个很简单易懂的代码,不跟网上大牛一样,代码玩的花,又递归,又调用函数的,我不行
建议大家先到网上看大牛分析,这里我还是新手,分析的不清楚
例题的一组数据不能说明问题 下面我来一组数据
5 10
4 6
5 4
3 2
1 5
6 8
结合代码分析 直接上代码分析
#include<stdio.h>#include<string.h>int max(int a,int b){ if(a>b) return a; else return b;}int a[1005][1005];int c[1001],w[1001];int main(){ int n,v; while(scanf("%d%d",&n,&v)!=EOF) { if(n==0&&v==0) { break; } memset(a,'\0',sizeof(0)); for(int k=1; k<=n; k++) { scanf("%d%d",&c[k],&w[k]); } for(int i=1; i<=n; i++) //i表示第几件物品 { for(int j=1; j<=v; j++) //j表示背包空间大小 { if(j<c[i]) { a[i][j]=a[i-1][j]; } else { a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]); } //printf("%2d ",a[i][j]); } //printf("\n"); } printf("%d\n",a[n][v]); }}
其他的没什么难的,重点在这部分
for(int i=1; i<=n; i++) //i表示第几件物品
{
for(int j=1; j<=v; j++) //j表示背包空间大小
{
if(j<c[i])
{
a[i][j]=a[i-1][j];
}
else
{
a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);
}
i 表示图片的第 i 行,V表示图片上的第 v 列
原理;这其实就是贪心的变形,动规就是找子问题中找最优解,然后递推,找到原问题的最优解
假设前面我们已经找到最优解了 下面找a[i][j]的最优解
a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);
这其实就是a[i][j]的最优解
如果不明白就带入 i j 一个一个与图表对应
j<c[i] 保证的是a[i-1][j-c[i]]有意义,不会伸出数组外面
当伸出数组外面 a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);不再成立
只能用a[i][j]=a[i-1][j];
- vj-苹果(01背包)
- VJ【背包】
- nyoj289苹果(01背包)
- nyoj289苹果(01背包)
- 289 苹果(01背包)
- 01背包--苹果,背包问题
- 背包问题-背包01-苹果
- 苹果(01背包题目5)
- nyoj-289-苹果(01背包)
- nyoj 苹果 289 (简单01背包)
- nyoj--289--苹果(01背包)
- nyoj--289--苹果(01背包)
- NYOJ289:苹果(01背包入门)
- nyoj 289 苹果 (01背包)
- 苹果(再解01背包问题)
- NYOJ 289-苹果(01背包)
- NYOJ 289 苹果(01背包问题)
- NYOJ289 苹果 【01背包】
- android 获取状态栏高度--利用getIdentifier()
- HTTP和HTTPS的区别
- 2016/11/23学习工作日志
- Linux eclipse安装及使用
- 01背包
- vj-苹果(01背包)
- leetcode(36) - Valid Sudoku 数独
- Atitit 面向对象弊端与问题 坏处 缺点
- JNI
- 高交会上的科技创新:VR、无人机、机器人齐聚Qualcomm展台
- scp
- windows下的Eclipse连接虚拟机中的hadoop,操作过程中报节点无法识别问题解决
- Win10高分屏笔记本更改DPI后软件界面字体变模糊的解决方案之一
- JavaScript 调用发布的GP服务