uva 624 CD
来源:互联网 发布:网络设备监控软件 开源 编辑:程序博客网 时间:2024/05/18 16:14
背包问题,要求把路径打印出来。
最后一组测试数据上跟答案有点不同,因为该数据存在两种方案。
题目没说,但是在有多种方案时随便打印一种即可的。
#include <stdio.h>#include <string.h>int main(){int N, t, i, j, sum;int dp[2001], a[22];;while(scanf("%d%d", &N, &t) != EOF){memset(dp, -1, sizeof(dp));dp[0] = 0;for(i = 0; i < t; i++){scanf("%d", &a[i]);}for(i = t - 1; i >= 0; i--){for(j = N; j >= a[i]; j--){if(dp[j - a[i]] != -1 && dp[j] == -1){dp[j] = a[i];}}}while(dp[N] == -1){N--;}int sum = N;while(N){printf("%d ", dp[N]);N -= dp[N];}printf("sum:%d\n", sum);}return 0;}
和测试数据输出一样的代码:
#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=2001;int n,m,a[22],dp[maxn];bool vis[maxn][22];int main(){ while(scanf("%d%d",&n,&m)!=EOF) {memset(vis,0,sizeof(vis));memset(dp,0,sizeof(dp));for(int i=m-1;i>=0;i--) scanf("%d",&a[i]);for(int i=0;i<m;i++) for(int j=n;j>=a[i];j--)if(dp[j]<=dp[j-a[i]]+a[i]){ dp[j]=dp[j-a[i]]+a[i]; vis[j][i]=1;}for(int i=m-1,j=n;i>=0;i--){ if(vis[j][i]) {printf("%d ",a[i]);j-=a[i]; }}printf("sum:%d\n",dp[n]); } return 0;}
0 0
- uva 624 CD
- UVa 624 - CD
- Uva 624 CD
- UVA 624 CD
- UVa 624 - CD
- UVa 624 - CD
- uva 624 CD
- uva 624 CD
- UVa 624 - CD
- UVa 624 CD
- Uva-624-CD
- CD UVA 624
- UVA 624 CD
- UVA 624 - CD
- UVa:624 CD
- UVa 624: CD
- UVA - 624 CD
- uva 624 cd
- php后期静态绑定
- Docker容器的跨主机连接
- 一起做面试题--递归读取文件
- Qt窗口全部显示
- 【数据结构】栈和队列
- uva 624 CD
- 数据结构_实验1:链表的应用
- 关于树分块算法的一些研究
- 两点小结
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛
- Spark学习笔记:Pregel API
- (OK) Fedora23—NS3—Docker—MANETs—Testing
- poj 2349 Arctic Network(最小生成树变形)
- java中将byte转化为字母