洛谷 P1049装箱问题(dp)

题目

#include <iostream>

using namespace std;
///以下是未剪枝的dfs超时代码
/*
bool visit[35]={false};
int a[35];
int minn=20000;
int n;
void dfs(int w)
{
    if(w<0) return;
    if(minn>w) minn=w;
    if(minn==0) return;
    for(int i=0;i<n;i++)
    {
        if(visit[i]==false)
        {
            visit[i]=true;
            dfs(w-a[i]);
            visit[i]=false;
        }
    }
}
int main()
{
    int w;cin>>w;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    dfs(w);
    cout<<minn;
    return 0;
}
*/

int v[20005];
int w[35];
int main()
{
    int n;
    int value;
    cin>>value>>n;
    for(int i=0;i<n;i++)
    {
        cin>>w[i];
    }
    for(int i=0;i<=value;i++)v[i]=value;///将所有的情况初始化为最少剩下value的空间
    for(int i=0;i<n;i++)
    {
        for(int j=value;j>=w[i];j--)
        {
            v[j]=min(v[j-w[i]]-w[i],v[j]);///当储存空间为j时最少剩下v[j]的空间
        }
    }
    cout<<v[value];///输出储存空间为value时的值
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值