【uva】624 CD【背包记录路径】
2016-06-29 10:43
225 查看
题意:
背包+路径记录
题解:
用一个vis[i][j]记录容量为j的背包里面有没有用到过i物品,物品是倒着放的,具体实现看代码
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10005;
int cd[25],dp
,v[25];
bool vis[25]
;
int main()
{
int i,j,n,m;
while(scanf("%d",&m)!=EOF){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&v[i]);
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
for(i=n;i>=1;i--){
for(j=m;j>=v[i];j--){
if(dp[j-v[i]]+v[i]>dp[j]){
vis[i][j]=1;
dp[j]=dp[j-v[i]]+v[i];
}
}
}
for(i=1,j=dp[m];i<=n&&j>0;i++)
if(vis[i][j]){
printf("%d ",v[i]),j-=v[i];
}
printf("sum:%d\n",dp[m]);
}
}
背包+路径记录
题解:
用一个vis[i][j]记录容量为j的背包里面有没有用到过i物品,物品是倒着放的,具体实现看代码
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10005;
int cd[25],dp
,v[25];
bool vis[25]
;
int main()
{
int i,j,n,m;
while(scanf("%d",&m)!=EOF){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&v[i]);
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
for(i=n;i>=1;i--){
for(j=m;j>=v[i];j--){
if(dp[j-v[i]]+v[i]>dp[j]){
vis[i][j]=1;
dp[j]=dp[j-v[i]]+v[i];
}
}
}
for(i=1,j=dp[m];i<=n&&j>0;i++)
if(vis[i][j]){
printf("%d ",v[i]),j-=v[i];
}
printf("sum:%d\n",dp[m]);
}
}
相关文章推荐
- git一些操作
- 一步步教你如何上传头像
- 关于EI论文写作的干货总结
- iOS屏幕锁实现
- ios 常用公共方法
- 应用上传到Appstore(二)ERROR ITMS-90022: "Missing required icon file.
- Java入门-图片云
- log4j定义某个类的日志级别
- 千字短文解决工程师们关于SPI的迷糊!
- FileInputStream的read方法详解
- Android左右切换的标签
- GitHub 优秀的 Android 开源项目
- eclipse显示奇怪文字
- 基于Android Studio开发手机本地文件浏览器
- Cocosd2d-js this关键字使用
- Maven 入门1- 简介
- 大学生没技能没经验就业难,多亏传智播客UI设计
- Redis的配置
- 社交分享(一)系统自带分享功能
- Jenkins2.1集成Sonar5.4进行持续代码分析