CF294B 书架

Shaass拥有n本书。他想为他的所有书制作一个书架,并想让书架的长宽尽量小。
第i本书的厚度是t[i],且这本书的纸张宽度是w[i]。书的厚度是1或2,所有书都有同样的高度(即书架的高是均匀的)
Shaass以以下的方式摆放这些书籍。

  • 1.他选择了一些书并竖直摆放它们。
  • 2.他将剩余的书籍水平纺织于竖直的书上面。 水平放置的书的宽度和不能多于竖直放置的书的总厚度。

帮助Shaass找到可以达到的书架长度最小值。

1. 动态规划

dp[i]定义为取厚度和为i时最小宽度和

void maxval(int n,vector<int>&c,vector<int>&w){ 
    int sum = accumulate(c.begin(),c.end(),0);
    vector<int> dp(sum+1,sum);
    dp[0] = 0;
    for(int i=0;i<n;i++)
        for(int j=sum;j>=c[i];j--)
            dp[j] = min(dp[j],dp[j-c[i]]+w[i]);
    for(int j=sum;j>=0;j--)
        if(sum-j>=dp[j]){
            cout<<sum-j;
            return;
        }
    return;
}
posted @ 2023-08-23 21:11  失控D大白兔  阅读(8)  评论(0编辑  收藏  举报