sinat_41146801 2017-11-23 05:58 采纳率: 0%
浏览 829

0-1背包最优解怎么去构造

#include
#define N 5
int w[N]={18,13,15,5,8};
int v[N]={20,13,26,20,70};
int p[N]={-1};
int k=0;
int tb()
{
int i;
for(i=0;i printf("% d",p[i]);
printf("\n");
}
int m (int i,int j)
{
int n=N,s1,s2;
int a=0,b=0;
if(i==n)
if(j>=w[n])
{
p[k++]=i;
return v[n];
}

else return 0;
if(j<w[i])
   return m(i+1,j);
   else
   {
     //p[k++]=i;
        s1=m(i+1,j);
        s2=m(i+1,j-w[i])+v[i];
   }

if(s1>s2)
{
       p[k++]=i;
     return s1;
}

else
{
     p[k++]=i;
      return s2;
}

}
int main()
{
int i,t,C=30;
int k=0;
t=m(0,C);
printf("%d\n",t);
tb();

}

  • 写回答

1条回答 默认 最新

  • 狂颜 2018-03-25 09:38
    关注

    '''c++
    #include
    #include
    #include
    #define max(a,b) a>b ? a:b
    using namespace std;

    struct Node
    {
    int vi; // 价值
    int wi; // 重量
    };

    int dp[1005];
    int main()
    {
    freopen("in.txt", "r", stdin);
    int V, N, i, j;
    Node list[102];
    while (cin >> V >> N)
    {
    memset(list, 0, sizeof(list));
    memset(dp, 0, sizeof(dp));
    for (i = 0; i < N; i++) // 输入
    {
    cin >> list[i].wi >> list[i].vi;
    }
    for (i = 0; i < N; i++)
    {
    for (j = V; j >= 0; j--) // 完全背包更新 j从0->v *** 01背包更新 j从V->0
    {
    if (j >= list[i].wi) // 如果能装下
    {
    dp[j] = max(dp[j - list[i].wi] + list[i].vi, dp[j]);
    }
    }
    }
    cout << dp[V] << endl;
    }
    return 0;
    }
    '''

    评论

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类