01背包问题

tingfengx 2014-03-22 10:43:46
#include<iostream>
# include<cstring>
# define max(a,b) a>b?a:b
using namespace std;
int main()
{

int dp[101][1001],m,T,w[101],val[101],i,j;
cin>>T>>m;
for(i=1;i<=m;i++)
cin>>w[i]>>val[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
for(j=0;j<=T;j++)//j相当于上面说的V-c[i]
{
if(j>=w[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i]);//放还是不放的选择
else dp[i][j]=dp[i-1][j];
}
cout<<dp[m][T]<<endl;
return 0;
}


为什么循环是从i=1开始,而j从0开始?数组下标不是都从0开始吗
...全文
181 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
merlinfang 2014-03-24
  • 打赏
  • 举报
回复
因为循环里运算 [i-1]
shiguojie19892 2014-03-22
  • 打赏
  • 举报
回复
引用 楼主 tingfengx 的回复:
#include<iostream>
# include<cstring>
# define max(a,b) a>b?a:b
using namespace std;
int main()
{

    int dp[101][1001],m,T,w[101],val[101],i,j;
    cin>>T>>m;
    for(i=1;i<=m;i++)
        cin>>w[i]>>val[i];
    memset(dp,0,sizeof(dp));
    for(i=1;i<=m;i++)
     for(j=0;j<=T;j++)//j相当于上面说的V-c[i]
         {
    if(j>=w[i])
        dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i]);//放还是不放的选择
    else dp[i][j]=dp[i-1][j];
     }
     cout<<dp[m][T]<<endl;
     return 0;
}
为什么循环是从i=1开始,而j从0开始?数组下标不是都从0开始吗
我没有具体看这个背包问题是解决什么问题的,但是如你所说,i从几开始是和程序设计的逻辑相关的,语法上数组都是从下标0开始,但是可能这个程序的设计需要抛弃0从1开始呢?这个用法没有问题,要看实际的逻辑需要。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧