uva624(DP)
2016-05-12 19:35
302 查看
求解:
for(int i = 0; i < tracks; i++) {
for(int j = N; j >= 0;j–) {
if(j >= t[i] && dp[j] <= dp[j - t[i]] + t[i] && dp[j - t[i]]+t[i] <= N) {
dp[j] = dp[j - t[i]] + t[i];
// f[j] = 1; 为什么加上这些要保存值的答案就会错误
// save[j] = i;
}
代码:
for(int i = 0; i < tracks; i++) {
for(int j = N; j >= 0;j–) {
if(j >= t[i] && dp[j] <= dp[j - t[i]] + t[i] && dp[j - t[i]]+t[i] <= N) {
dp[j] = dp[j - t[i]] + t[i];
// f[j] = 1; 为什么加上这些要保存值的答案就会错误
// save[j] = i;
}
代码:
#include <iostream> using namespace std; #include <stdio.h> #include <cstring> int N; int tracks; int t[25]; int f[25]; int dp[25]; int save[25]; int main() { while(scanf("%d",&N) != EOF) { scanf("%d",&tracks); for(int i = 0; i < tracks; i++) { scanf("%d",&t[i]); // cout << t[i] <<endl; } memset(dp,0,sizeof(dp)); memset(f,0,sizeof(f)); int _max = 0; for(int i = 0; i < tracks; i++) { for(int j = N; j >= 0;j--) { if(j >= t[i] && dp[j] <= dp[j - t[i]] + t[i] && dp[j - t[i]]+t[i] <= N) { dp[j] = dp[j - t[i]] + t[i]; // f[j] = 1;a // save[j] = i; } //printf("%d ",f[j]); _max = max(_max,dp[j]); //printf("%d\n",_max); } //printf("%d\n",_max); } // print(N); for(int i = 0,j = N; i < tracks && j >= 0; i++) { } printf("%d\n",_max); } return 0; }
相关文章推荐
- 在指定控件位置弹出popup window
- 操作系统 实验三 进程调度模拟程序
- Docker (一) 运行容器
- Linux驱动调试中的Debugfs的使用简介
- 欢迎使用CSDN-markdown编辑器
- 053(七十六)
- BZOJ4521: [Cqoi2016]手机号码
- android UI——跑马灯TextView
- SDUT 2171 上升子序列
- 桥接(Bridge)
- 2-3 限次排列
- android 编译技巧
- GDB的一些技巧
- Scrum 项目3.0--软件工程
- 关闭error, forbidden warning
- CentOS搭建NTP服务器
- Android之初探RecyclerView
- 手动创建活动(activity)--1
- Android 内存管理工具
- 简单求和