swustoj 0032简单背包问题
2016-04-13 22:27
309 查看
Description
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。
问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。
如果有满足条件的选择,则此背包有解,否则此背包问题无解。
Input
输入数据有多行,包括放入的物品重量为s,物品的件数n,以及每件物品的重量(输入数据均为正整数)
多组测试数据。
Output
对于每个测试实例,若满足条件则输出”YES”,若不满足则输出”NO”
Sample Input
1
2
20 5
1 3 5 7 9
Sample output
YES
解题思路:01背包问题,背包只有装得下与装不下两种状态,非常简单的背包问题,思路为max(dp[i],dp[i-w[i]]+w[i]),也可以用递归,考虑到时间复杂度,dp效果更佳
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。
问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。
如果有满足条件的选择,则此背包有解,否则此背包问题无解。
Input
输入数据有多行,包括放入的物品重量为s,物品的件数n,以及每件物品的重量(输入数据均为正整数)
多组测试数据。
Output
对于每个测试实例,若满足条件则输出”YES”,若不满足则输出”NO”
Sample Input
1
2
20 5
1 3 5 7 9
Sample output
YES
解题思路:01背包问题,背包只有装得下与装不下两种状态,非常简单的背包问题,思路为max(dp[i],dp[i-w[i]]+w[i]),也可以用递归,考虑到时间复杂度,dp效果更佳
#include<stdio.h> #include<string.h> #define N 3000 int dp ,w ; int max(int x,int y) { return x > y ? x : y; } int DP(int x,int y) { int i,j; for(i=0;i<y;i++) { for(j=x;j>=w[i];j--) { dp[j]=max(dp[j],dp[j-w[i]]+w[i]); } } if(dp[x]==x) return 1; return 0; } int main() { int n,sum,i; while(~scanf("%d",&sum)) { memset(dp,0,sizeof(dp)); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&w[i]); } if(sum==0) { printf("YES\n"); continue; } int index=DP(sum,n); if(index) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- Spring依赖注入的好处
- ios UITapGestureRecognizer 单指单击、单指多击、多指单击、多指多击事件操作
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
- 欢迎使用CSDN-markdown编辑器
- 神经网络算法
- hibernate和mybatis的比较
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
- JAVA中的反射机制
- nfs搭建试验
- excel排版大师:excel文件批量加水印
- jdbc连接oralce操作
- Python你必须知道的十个库
- 《linux高性能服务器编程》学习笔记(二)之拥塞控制
- 用实例给新手讲解RSA加密算法
- ArcGIS FeatureLayer 中文乱码问题
- 组合数
- java实现redis数据库访问
- php 学习记录
- Android 自定义View (一)
- mysql学习总结