摘要:
#include <iostream>#include <cstdio>#include <string.h>WA了好多次,才发现动态转移方程有问题,这大概就是多个选择得到最优值吧此题类似多重背包,每组至少选一个,代码好乱哇using namespace std;int max(int a,int b){ if (a>b) return a; else return b;}struct node{ int k,cost,value;}s[1500];int dp[15][10005];int main(){ int n,k,v,i,j,l; while 阅读全文
摘要:
该题目为求01背包中的第k最优解: 开始时用dpp[i][j]表示用体积为i得到价值为j,WA了好多次,系统说是数组开的大小有问题 应该定义数组dp[i][j][k]表示前i个物品中用体积j所得价值排名第k,类似于dp[i][j], 该数组每次有两个方案可得,即dp[i-1][j][k]与dp[i-1][j-cost[i]][k]+value[i]; 用数组A及数组B分别保存数组dp[i-1][j][k]及数组dp[i-1][j-cost[i]][k]+value[i]的前k项, 再对两个数组进行合并,赋值给dp[i][j][k],不过知道最优是k优的一种特殊情况了,代码如下:#includ. 阅读全文